Tag: c ++ 11

如何在Clang中使用C ++ 11function?

我如何使用Clang中最新的C ++ 11function? 哪些(子)function集支持?

可以在gcc模拟nullptr?

我看到nullptr是在Visual Studio 2010中实现的。我喜欢这个概念,并希望尽快开始使用它。 但是GCC目前还不支持。 我的代码需要同时运行(但不必与其他编译器编译)。 有没有办法“模仿”呢? 就像是: #define nullptr NULL (这显然不能很好地工作,只是为了表明我的意思。)

是否有可能写一个函数模板,返回参数的数量是否可以被N整除?

我一直在学习可变参数模板,在这篇出色的博客文章的帮助下,我设法编写了一个函数模板even_number_of_args ,它返回它收到的参数个数是否可​​以被2整除。 #include <iostream> bool even_number_of_args() { return true; } template <typename T> bool even_number_of_args(T _) { return false; } template<typename T, typename U, typename… Vs> bool even_number_of_args(T _, U __, Vs… vs) { return even_number_of_args(vs…); } int main() { std::cout << even_number_of_args() << std::endl; // true std::cout << even_number_of_args(1) << std::endl; // false std::cout […]

在C ++ 11中,“i + = ++ i + 1”是否performance出未定义的行为?

这个问题出现在我正在阅读(答案)时,为什么我在C ++ 11中定义了明确的i ++ I + 1? 我收集的微妙的解释是(1)expression式++i返回一个左值,但是+ prvalues作为操作数,所以必须执行从左值到左值的转换; 这涉及获得该左值的当前值(而不是一个比旧的值多一个),因此必须在增量的副作用(即,更新i ) 后sorting(2)该赋值的LHS也是因此其价值评估不涉及获取i的当前价值; 而这个值的计算与RHS的值计算是不一致的,这就不存在问题。(3)赋值本身的值计算涉及更新i (再次),而是在RHS的值计算之后进行sorting,因此在先给i更新; 没问题。 好吧,那里没有UB。 现在我的问题是,如果将assigment操作符从=改成+= (或类似的操作符),会怎样。 expression式i += ++i + 1的评估是否会导致未定义的行为? 正如我所看到的那样,这个标准似乎在这里相互矛盾。 由于+=的LHS仍然是一个左值(而其RHS仍然是一个值),就上面(1)和(2)而言,同样的推理也适用。 在+=上操作数的评估中没有未定义的行为。 至于(3),复合赋值的操作+= (更准确地说是该操作的副作用;如果需要的话,它的值计算在任何情况下都在其副作用之后被sorting)现在必须同时获取当前值i , 然后 (明显地按顺序排列,即使标准没有明确说明,否则评估这样的操作符总是会调用未定义的行为)添加RHS并将结果存回i 。 如果这些操作在++副作用下没有被确定,那么这两个操作都会给出未定义的行为,但是正如上面所讨论的( ++的副作用是在给出+=操作符的RHS的值计算之前进行sorting的,哪个值计算在该复合赋值操作之前被sorting),情况并非如此。 但是另一方面,标准还表示E += F相当于E = E + F ,只是(左值)E只被评估一次。 现在在我们的例子中, 作为左值的i (这是E在这里是什么)的值计算不涉及需要与其他动作sorting的任何事情,因此做一次或两次都没有区别; 我们的expression应严格等于E = E + F 但是这是问题。 很明显,评估i = i + […]

在C ++预处理器中,R和L有什么特别之处?

我通过Visual Studio 2013预处理器运行以下代码。 输出令我惊讶。 hello.cpp的内容: #define A(j) #j A(A?) A(B?) A(C?) A(D?) A(E?) A(F?) A(G?) A(H?) A(I?) A(J?) A(K?) A(L?) A(M?) A(N?) A(O?) A(P?) A(Q?) A(R?) A(S?) A(T?) A(U?) A(V?) A(W?) A(X?) A(Y?) A(Z?) 命令: cl /P hello.cpp hello.i包含: #line 1 "hello.cpp" "A?" "B?" "C?" "D?" "E?" "F?" "G?" "H?" "I?" "J?" "K?" "L" "M?" […]

C ++ 11基于范围的for循环条件是否在每个周期被评估?

for(auto& entity : memoryManager.getItems()) entity->update(mFrameTime); 如果memoryManager包含1000个项目, memoryManager.getItems()会被调用1000次,或者只有一个在循环的开始? 编译器是否使用-O2(或-O3)运行任何优化? ( memoryManager.getItems()返回一个std::vector<Entity*>& )

编译时间如何(按指数规律)比运行时更快?

下面的代码通过指数式慢algorithm计算斐波纳契数: #include <cstdlib> #include <iostream> #define DEBUG(var) { std::cout << #var << ": " << (var) << std::endl; } constexpr auto fib(const size_t n) -> long long { return n < 2 ? 1: fib(n – 1) + fib(n – 2); } int main(int argc, char *argv[]) { const long long fib91 = fib(91); DEBUG( […]

C ++ 11 emplace_back载体<struct>?

考虑下面的程序: #include <string> #include <vector> using namespace std; struct T { int a; double b; string c; }; vector<T> V; int main() { V.emplace_back(42, 3.14, "foo"); } 它不工作: $ g++ -std=gnu++11 ./test.cpp In file included from /usr/include/c++/4.7/x86_64-linux-gnu/bits/c++allocator.h:34:0, from /usr/include/c++/4.7/bits/allocator.h:48, from /usr/include/c++/4.7/string:43, from ./test.cpp:1: /usr/include/c++/4.7/ext/new_allocator.h: In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& …) [with _Up = T; […]

为什么我必须明确指定STLalgorithm函数的范围,即使我想在整个容器上工作?

当使用STL的sort()或min_element()函数时,我总是必须明确地指定范围的开始和结束: void range_example() { std::vector<int> list = {7, 3, 9, 1, 5, 2}; auto found_element = std::min_element(list.begin(), list.end()); std::cout << *found_element << std::endl; } 这是有道理的,如果我打算只在我的容器的一部分工作,但更多的时候我需要function在整个容器上工作。 是否有一个原因,为什么没有一个重载的function,允许这样做: std::vector<int> list = {7, 3, 9, 1, 5, 2}; auto found_element = std::min_element(list); 有没有办法完成一个我忽略的容器的总范围的函数调用? 编辑:我知道,我可以封装在一个函数本身,但因为这必须做所有function,我想避免,如果有更好的办法。

新的C ++ 11成员初始化特性是否在声明时使初始化列表过时了?

使用C ++ 11,我们现在可以在头文件声明中初始化类成员: class aClass { private: int mInt{100}; public: aClass(); ~aClass(); }; 所以我有点困惑。 传统上,构造函数中的初始化列表已被用于成员初始化: aClass::aClass() : mInt(100) { … } 新的C ++ 11成员初始化特性是否在声明时使初始化列表过时了? 如果不是的话,那么一个优于另一个呢? 什么情况会使声明初始化有利,或者初始化列表是否有利? 什么时候应该使用另一个?