Questions tagged «c++14»

C ++ 14是2014年批准的C ++标准的名称。它以以前的C ++ 11标准为基础,改进了核心语言和标准库并添加了一些功能。

3
Lambda闭包左值可以作为右值参考参数传递
我发现lvaluelambda闭包始终可以作为rvalue函数参数传递。 请参见以下简单演示。 #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function<void()> fn2 = []{}; foo(fn2); // compile error return 0; } …

4
连续枚举C ++ 11
有没有一种方法可以在C ++ 11中检查枚举是否连续? 给出一个不是的枚举值是完全有效的。在C ++ 14,C ++ 17或C ++ 20中是否可能有类似类型特征的功能来检查枚举是否连续?这将在static_assert中使用。 一个小例子如下: enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, B = 1, C = 2 }; static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be …
17 c++  c++11  c++14  c++17  c++20 

3
仅对定义了功能的类型在功能模板内执行功能
我有一个函数模板,它接受许多不同的类型。在这些类型中,只有其中一种具有getInt()功能。因此,我希望代码仅针对该类型运行函数。请提出解决方案。谢谢 #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want this to be called …

1
为什么表达式类型在C ++中的版本之间会发生变化?
我尝试理解C ++的表达式类型,我读的越多,我就越困惑,因为我发现C ++草案很难理解,因此倾向于使用其他资源,但是它们彼此矛盾,或者没有考虑到C ++版本之间的措辞和定义有很大的变化。 在下文中,我指的是以下草案: C ++ 11 [ n3690 ](最终草案) C ++ 17 [ n4659 ](最终草案) C ++ 20 [ n4835 ](当前草案) C++11 3.10左值和右值 ... prvalue(“纯” rvalue)是不是xvalue的rvalue。[示例:调用返回类型不是引用的函数的结果是prvalue。文字的值(例如12、7.3e5或true)也是prvalue。—结束示例] C++17 3.10左值和右值 ... prvalue是一个表达式,其求值初始化一个对象或位域,或计算一个运算符的操作数的值,该值由其出现的上下文指定。 C++20 7.2.1值类别* ... prvalue是一个表达式,其求值初始化一个对象或位字段,或者计算一个运算符的操作数(由其出现的上下文指定),或者是cv void类型的表达式。 我会理解措词的更改,并进行了一些调整,但对我而言,整个定义都会更改。有人可以帮我理解吗?例如,为什么删除了一个句子,即prvalue是不是xvalue的rvalue?还是为什么删除了有用的示例?
13 c++  c++11  c++14  c++17  c++20 

1
可以将变量模板作为模板模板参数传递吗?
以下荒谬的示例无法编译,但是还有其他方法可以将变量模板作为模板模板参数传递吗? template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() { return VariableTemplate<T> + T{1}; } int main() { return add_one<int, zero>(); } 尝试编译器资源管理器

1
为什么范围不能用于管道库功能?
乔纳森博卡拉(作者流利C ++)写了一个叫做库的管道。 存储库主页上说的“管道”与范围的使用不同,尽管看起来相同:它不是基于惰性拉动,而是急于推动。但有人指出,不能使用范围库执行各种“管道”操作。例如: 解压缩-采取一个压缩输入-本质上是一系列k元组-并产生k个独立的独立输出。 fork-产生容器/范围的多个(独立)副本。 我不太明白原则上为什么会这样。(当然,除了无法获得最终迭代器/前哨的范围之外。)

2
链接时如何取消副本?
我正在创建一个链接类型的类,例如下面的小示例。似乎在链接成员函数时,将调用复制构造函数。有没有办法摆脱复制构造函数调用?在下面的玩具示例中,很明显,我只在处理临时工,因此“应该”(也许不是按标准,而是从逻辑上)是一种省略。复制省略的第二个最佳选择是调用move构造函数,但事实并非如此。 class test_class { private: int i = 5; public: test_class(int i) : i(i) {} test_class(const test_class& t) { i = t.i; std::cout << "Copy constructor"<< std::endl; } test_class(test_class&& t) { i = t.i; std::cout << "Move constructor"<< std::endl; } auto& increment(){ i++; return *this; } }; int main() { …
10 c++  c++14  c++17 

1
从函数指针数组中传递函数指针作为模板参数
我想将功能指针数组中的功能指针作为模板参数传递。即使Intellisense抱怨有些问题,我的代码似乎还是使用MSVC编译的。gcc和clang均无法编译代码。 考虑以下示例: static void test() {} using FunctionPointer = void(*)(); static constexpr FunctionPointer functions[] = { test }; template <FunctionPointer function> static void wrapper_function() { function(); } int main() { test(); // OK functions[0](); // OK wrapper_function<test>(); // OK wrapper_function<functions[0]>(); // Error? } MSVC编译代码,但是Intellisense给出以下错误:invalid nontype template argument of type "const …
9 c++  templates  c++14 

3
在C ++ 14中具有Init Capture的C ++ Lambda代码生成
我试图理解/阐明将捕获传递给lambda时生成的代码,尤其是在C ++ 14中添加的广义init捕获中。 提供下面列出的以下代码示例,这是我目前对编译器将生成的内容的理解。 情况1:按值捕获/默认值捕获 int x = 6; auto lambda = [x]() { std::cout << x << std::endl; }; 等于: class __some_compiler_generated_name { public: __some_compiler_generated_name(int x) : __x{x}{} void operator()() const { std::cout << __x << std::endl;} private: int __x; }; 因此,存在多个副本,一个副本要复制到构造函数参数中,而另一个副本要复制到成员中,这对于矢量等类型而言将是昂贵的。 情况2:按引用捕获/默认按引用捕获 int x = 6; auto lambda …
9 c++  lambda  c++14  move 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.