Tag: c ++ 11

C ++中未评估的上下文是什么?

经常想到的一个例子是: sizeofexpression式,它不计算expression式,但是通过静态types来确定大小。 例如 : int func(); sizeof(func()); 这是我思考的极限,所以如果还有其他未被评估的情境,那么它们是什么?

lambda函数对象中的静态variables如何工作?

在使用lambda的函数的调用中保留的lambda中使用了静态variables? 或者是函数对象“创build”每个函数调用? 无用的例子: #include <iostream> #include <vector> #include <algorithm> using std::cout; void some_function() { std::vector<int> v = {0,1,2,3,4,5}; std::for_each( v.begin(), v.end(), [](const int &i) { static int calls_to_cout = 0; cout << "cout has been called " << calls_to_cout << " times.\n" << "\tCurrent int: " << i << "\n"; ++calls_to_cout; } ); } int […]

C ++ 11:编译数组的时间计算

假设我有一些constexpr函数f: constexpr int f(int x) { … } 我在编译时有一些const int N: 或 #define N …; 要么 const int N = …; 根据您的答案需要。 我想要一个int数组X: int X[N] = { f(0), f(1), f(2), …, f(N-1) } 这样在编译时计算函数,X中的条目由编译器计算,结果放在我的应用程序映像的静态区域,就好像我在我的X初始化列表中使用了整数文字一样。 有什么方法可以写这个吗? (例如使用模板或macros等) 我有最好的(谢谢柔印) #include <iostream> #include <array> using namespace std; constexpr int N = 10; constexpr int f(int x) { return […]

为什么C ++ 11不支持匿名结构,而C11呢?

C11支持匿名结构,如下所示: struct Foo { struct { size_t x, y; }; }; struct Foo f; fx = 17; fy = 42; 基本上,这样的struct的成员被视为如果它们是封闭的struct或union成员(recursion,如果封闭的结构本身是匿名的)。 C ++ 11的基本原理是不包括匿名结构? 它们通常是非常有用的(大多数在工会内部,为了消除struct的标识符的键入)。 但是,对于规范(以及许多编译器已经实现的规范)来说,它们似乎是一个明显的补充,它们肯定已经被讨论过了,至less要保持与C11标准的兼容性。 那么他们为什么不添加?

primefacesvariables是否是无锁的?

当我们谈论primefacesvariables,例如C ++ 11的atomic<> ,它是否可以自由locking? 或者是无锁的东西有所不同? 如果我用primefacesvariablespipe理一个队列,它会比一个无锁队列慢吗?

在C ++ 11中是否有一个零大小的std :: array的原因?

考虑下面的一段代码,C ++ 11编译器完全可以接受这段代码: #include <array> #include <iostream> auto main() -> int { std::array<double, 0> A; for(auto i : A) std::cout << i << std::endl; return 0; } 根据标准§23.3.2.8[ 零尺寸arrays ]: 1arrays应提供对特殊情况N == 0 。 2在N == 0的情况下, begin() == end() ==唯一值。 返回值 data()是未指定的。 3调用front()或back()调用一个零大小的数组是没有定义的。 4成员函数swap()应该有一个noexcept-speci fi cation,相当于noexcept(true) 。 如上所示,在C ++ 11中,零大小的std::array是完全允许的,与零大小的数组(例如, int A[0]; )相比,它们被明确禁止,但它们被一些编译器例如GCC)以未定义的行为为代价。 考虑到这个“矛盾”,我有以下几个问题: […]

忽略gcc / clang的“-Wmissing-Braces”警告是明智的吗?

考虑下面的程序: #include <array> int main() { std::array<int, 1> x = { 0 }; // warning! x = { { 0 } }; // no warning return 0; } 第一次初始化导致gcc 4.7.2上的警告… main.cpp:5:22: warning: unused variable 'x' [-Wunused-variable] …和铿锵3.1 main.cpp:5:28: warning: suggest braces around initialization of subobject [-Wmissing-braces] std::array<int, 1> x = { 0 }; 就标准而言,至less在这个例子中,双花括号或单花括号应该没有区别。 有两种方法来处理警告: […]

在C ++ 11中的析构函数之后重写标识符

虚拟析构函数声明之后的覆盖标识符是否有特殊含义? class Base { public: virtual ~Base() {} virtual int Method() const {} }; class Derived : public Base { public: virtual ~Derived() override {} virtual int Method() override // error: marked override, but does not override – missing const {} }; 在虚拟方法上使用覆盖标识符是有用的,因为检查:当基本虚拟方法实际上没有被覆盖时,编译器将报告错误。 在虚拟析构函数上的重写是否也有任何意义/function?

C ++ 11基于范围的循环效率“const auto&i”与“auto i”

在C ++ 11中,我可以像这样迭代一些容器: for(auto i : vec){ std::cout << i << std::endl; } 但是我知道这是毫无必要的,因为我只需要打印 vec的值就可以得到vec每个元素的副本,所以我可以这样做: for(auto &i : vec){ std::cout << i << std::endl; } 但是我想确保vec的值永远不会被修改,并遵守const的正确性,所以我可以这样做: for(const auto &i : vec){ std::cout << i << std::endl; } 所以我的问题是:如果我只需要看一些容器的值,不会最后一个循环( const auto &i )总是首选,因为没有额外的副本效率提高( 编辑 :每个元素的) vec ? 我有一个我正在开发的程序,我正在考虑在整个过程中进行这样的改变,因为效率是非常关键的(我在第一个地方使用C ++的原因)。

C ++:在多行string常量中是否有行尾的标准定义?

如果我有一个多行stringC ++ 11string常量如 R"""line 1 line 2 line3""" 是否定义了行结束符/分隔符包含哪些字符?