Tag: c ++ 11

“int size = 10;”产生一个常量expression式吗?

下面的代码在gcc 4.8和Clang 3.2下编译: int main() { int size = 10; int arr[size]; } C ++标准的8.3.4 / 1指出数组的大小必须是一个整数常量expression式,这个size似乎不是。 这是两个编译器的错误,还是我错过了什么? 最新的VC ++ CTP用这个有趣的消息拒绝代码: error C2466: cannot allocate an array of constant size 0 有趣的部分是它似乎认为size为零。 但至less它拒绝了代码。 gcc和Clang不应该这样做吗?

std :: enable_if有条件地编译一个成员函数

我试图得到一个简单的例子来了解如何使用std::enable_if 。 读完这个答案之后 ,我想应该不难想出一个简单的例子。 我想使用std::enable_if来select两个成员函数,并只允许使用其中的一个。 不幸的是,下面的代码不能用gcc 4.7进行编译,并且在几个小时和几个小时的尝试之后,我问你们我的错误是什么。 #include <utility> #include <iostream> template< class T > class Y { public: template < typename = typename std::enable_if< true >::type > T foo() { return 10; } template < typename = typename std::enable_if< false >::type > T foo() { return 10; } }; int main() { Y< double […]

我可以列出初始化一个只移动types的向量吗?

如果我通过我的GCC 4.7快照传递下面的代码,它会尝试将unique_ptr复制到vector中。 #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } 显然,不能工作,因为std::unique_ptr是不可复制的: 错误:使用已删除的函数std :: unique_ptr <_Tp,_Dp> :: unique_ptr(const std :: unique_ptr <_Tp,_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp,_Dp> = std :: unique_ptr]' 试图复制初始化列表中的指针是否正确?

为什么每次运行std :: random_device和mingw gcc4.8.1都得到相同的序列?

我使用下面的代码来testingc++ <random>库。 为什么每次运行编译的可执行文件都得到完全相同的序列? rd()在编译时是确定的吗? 每次运行如何获得不同的输出? 在Windows 7 64bit上的GCC 4.8.1。 使用来自http://nuwen.net/mingw.html的 MinGW发行版 编辑:我用Visual Studiotesting了相同的代码。 没有问题。 输出是不确定的。 这可能是在我使用的mingw gcc 4.8.1中的一个bug。 #include <iostream> #include <random> using namespace std; int main(){ random_device rd; mt19937 mt(rd()); uniform_int_distribution<int> dist(0,99); for (int i = 0; i< 16; ++i){ cout<<dist(mt)<<" "; } cout <<endl; }

COW std :: string在C ++ 11中的合法性

我的理解是copy-on-write不是在C ++ 11中实现符合std::string的可行方法,但是最近在讨论中提到时,我发现自己无法直接支持该语句。 我正确的说C ++ 11不承认基于COW的std::string吗? 如果是这样,这个限制在新标准(哪里)的某个地方明确表示? 或者这个限制是暗示的,就是说这是std::string的新的需求的组合效果,它排除了基于COW的std::string 。 在这种情况下,我会对“C ++ 11有效地禁止基于COW的std::string实现”的章节和经文样式派生感兴趣。

是否有可能在标准C ++中打印variables的types?

例如: int a = 12; cout << typeof(a) << endl; 预期产出: int

为什么预处理器macros是邪恶的,有什么select?

我一直都这样问,但是我从来没有收到过很好的答案。 我认为在编写第一个“Hello World”之前,几乎所有的程序员都遇到过“macros不该用”,“macros都是恶”等字眼,我的问题是:为什么? 随着新的C + + 11有这么多年后真正的select? 这个简单的部分是关于像#pragma这样的macros,它们是平台特定的和编译器特定的,而且大多数时候像#pragma once这样的严重缺陷#pragma once在至less2个重要的情况下容易出错:在不同的path中有相同的名字,networking设置和文件系统。 但总的来说,macros和它们的用法的替代方法呢?

实现C ++ 14 make_integer_sequence

我试图实现C ++ 14别名模板make_integer_sequence ,这简化了类模板integer_sequence的创build。 template< class T, T… I> struct integer_sequence { typedef T value_type; static constexpr size_t size() noexcept { return sizeof…(I) ; } }; template< class T, T N> using make_integer_sequence = integer_sequence< T, 0,1,2, … ,N-1 >; // only for illustration. 为了实现make_integer_sequence我们需要一个辅助结构make_helper 。 template< class T , class N > using make_integer_sequence […]

push_back vs emplace_back

我有点困惑push_back和emplace_back之间的区别。 void emplace_back(Type&& _Val); void push_back(const Type& _Val); void push_back(Type&& _Val); 由于有一个push_back超载取右值引用,我不明白emplace_back的目的是什么?

T &&(双和号)在C ++ 11中意味着什么?

我一直在研究C ++ 11的一些新特性,我注意到了在声明variables中的双和号,比如T&& var 。 一开始,这个野兽叫什么名字? 我希望Google允许我们search这样的标点符号。 究竟是什么意思? 乍一看,它似乎是一个双引用(就像C风格的双指针T** var ),但是我很难想到这个用例。