Tag: c ++ 11

将vector<T>转换为initializer_list <T>

每个人都从std::initializer_list创buildstd::vector ,但是std::initializer_list呢? 例如。 如果你使用std::initializer_list作为参数: void someThing(std::initializer_list<int> items) { … } 有些时候,你有你的项目在一个vector<T>而不是一个文字列表: std::vector<int> v; // populate v with values someThing(v); // boom! No viable conversion etc. 更一般的问题是:如何从STL迭代中创build一个stl::initializer_list ,而不仅仅是std::vector 。

在C ++ 11中应该先发生什么:原始string扩展或macros?

此代码在Visual C ++ 2013中工作,但不在gcc / clang中: #if 0 R"foo( #else int dostuff () { return 23; } // )foo"; #endif dostuff(); Visual C ++首先删除if 0。 Clang首先扩展R原始string(并且从不定义dostuff)。 谁是对的,为什么?

为什么push_back不能被重载来执行emplace_back的工作?

首先,我知道这个问题 ,但我不相信我也在问同样的问题。 我知道什么std::vector<T>::emplace_back 做 – 我明白为什么我会用push_back() 。 它使用可变参数模板,允许我将多个参数转发给新元素的构造函数。 但是我不明白的是为什么C ++标准委员会决定需要一个新的成员函数。 为什么他们不能简单地扩展push_back()的function。 据我所见, push_back可能在C ++ 11中被重载为: template <class… Args> void push_back(Args&&… args); 这不会中断向后兼容性,同时允许您传递N个参数,包括将调用正常右值或复制构造函数的参数。 实际上, push_back()的GCC C ++ 11实现只是简单地调用emplace_back: void push_back(value_type&& __x) { emplace_back(std::move(__x)); } 所以,我看到它的方式,不需要emplace_back() 。 所有他们需要添加的push_back()接受可变参数的重载,并将参数转发给元素构造函数。 我错了吗? 有没有什么理由需要一个全新的function呢?

如何将一个lambdaexpression式存储为C ++ 11中的一个类的字段?

我想创build一个类,客户端可以存储一个类似于[]() -> void {}的lambdaexpression式作为类的字段,但我不知道如何去做。 一个答案build议使用decltype ,我试过没有成功。 这里是一个ideone源代码链接 。 以下是来源和结果: #include <cstdio> auto voidLambda = []()->void{}; class MyClass { public: decltype(voidLambda) t; MyClass(decltype(voidLambda) t) { this->t = t; } }; int main() { MyClass([] { printf("hi"); }); } 结果: prog.cpp: In constructor 'MyClass::MyClass(<lambda()>)': prog.cpp:3:79: error: no matching function for call to '<lambda()>::__lambda0()' prog.cpp:2:20: note: candidates are: […]

我真的需要为const对象实现用户提供的构造函数吗?

我有这个代码: class A { public: A() = default; private: int i = 1; }; int main() { const A a; return 0; } 它在g ++(见ideone )上编译得很好,但在clang ++上失败,出现错误: consttypes“const A”的对象的默认初始化需要用户提供的默认构造函数 我在LLVM bug跟踪器上报告了这个问题,并将其视为无效。 我认为试图说服铿锵的开发者绝对毫无意义。 另一方面,我看不出这种限制的原因。 任何人都可以build议,如果C ++ 11标准莫名其妙地暗示此代码是无效的? 或者我应该只是向g ++报告错误? 或者,也许在语言规则方面有足够的自由来处理这些代码?

为什么我们在C ++中使用std :: function而不是原来的C函数指针呢?

在原始T1 (*)(T2) , std::function<T1(T2)>的优点是什么?

可以定义一个完全一般的swap()函数吗?

以下片段: #include <memory> #include <utility> namespace foo { template <typename T> void swap(T& a, T& b) { T tmp = std::move(a); a = std::move(b); b = std::move(tmp); } struct bar { }; } void baz() { std::unique_ptr<foo::bar> ptr; ptr.reset(); } 不为我编译: $ g++ -std=c++11 -c foo.cpp In file included from /usr/include/c++/5.3.0/memory:81:0, from foo.cpp:1: /usr/include/c++/5.3.0/bits/unique_ptr.h: In […]

Constexprmath函数

所以从这个页面上注意到,在c ++ 11中没有一个math函数似乎使用了constexpr,而我相信它们都可以。 所以这给我留下了两个问题,一个是他们为什么不selectfunction。 一个像sqrt这样的函数我可以写自己的constexpr,但是像sin或者cos这样的东西会更棘手,所以围绕它就会出现。

为什么我们需要将函数标记为constexpr?

C ++ 11允许使用constexpr说明符声明的函数在常量expression式(如模板参数)中使用。 有关什么是可以被constexpr有严格的要求; 本质上这样一个函数只封装一个子expression式,没有别的。 (编辑:这是放松的C + + 14中,但问题的立场。) 为什么要求关键字呢? 获得了什么? 它确实有助于揭示接口的意图,但是它并没有validation意图,通过保证函数在常量expression式中是可用的。 在编写constexpr函数之后,程序员仍然必须: 编写一个testing用例或以其他方式确保它在一个常量expression式中被使用。 在常量expression式上下文中logging哪些参数值是有效的。 与揭示意图相反,装饰函数与constexpr可能会增加一个错误的安全感,因为切向语法约束被检查而忽略了中心语义约束。 简而言之 ,如果函数声明中的constexpr只是可选的,会不会对语言产生不良影响? 或者是否对任何有效的程序都有影响?

在VC2013中不能编译

此Constexpr代码不在Visual Studio 2013版本12.0.21005.1 REL中编译 是否有一个新的Visual Studio编译器与constexpr一起工作? #include <iostream> constexpr int factorial(int n) { return n <= 1 ? 1 : (n * factorial(n – 1)); } int main(void) { const int fact_three = factorial(3); std::cout << fact_three << std::endl; return 0; } 编译输出: 1> ——开始生成:Project:Project1,configuration:Debug Win32 —— 1> Source.cpp 1> …. \ source.cpp(3):错误C2144:语法错误:'int'应该以';'开始 1> …. […]