Questions tagged «c++11»

将此标记用于必须作为C ++ 11编译的代码(不使用C ++ 14或更高版本中引入的任何功能)。

4
何时使类型在C ++ 11中不可移动?
令我惊讶的是,它没有出现在我的搜索结果中,考虑到C ++ 11中移动语义的用处,我想有人会问过这个问题: 什么时候需要(或者对我来说是个好主意)使类在C ++ 11中不可移动? (原因等比现有的代码,也就是兼容性问题。)

2
Lambda捕获和具有相同名称的参数-谁遮蔽了另一个?(c声与gcc)
auto foo = "You're using g++!"; auto compiler_detector = [foo](auto foo) { std::puts(foo); }; compiler_detector("You're using clang++!"); clang ++ 3.6.0及更高版本打印出“您正在使用clang ++!” 并警告捕获 foo未使用。 g ++ 4.9.0及更高版本打印出“您正在使用g ++!” 并警告未使用该参数 foo。 哪种编译器更准确地遵循C ++标准? 魔盒示例

6
移动赋值运算符和`if(this!=&rhs)`
在类的赋值运算符中,通常需要检查被赋值的对象是否是调用对象,因此您无需搞砸: Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment } return *this; } 移动分配运算符是否需要相同的东西?有没有一种情况this == &rhs是对的? ? Class::operator=(Class&& rhs) { ? }

3
1.0是std :: generate_canonical的有效输出吗?
我一直认为随机数在0到1之间,而没有1,即它们是半开区间[0,1)中的数字。cppreference.com上的文件std::generate_canonical证实了这一点。 但是,当我运行以下程序时: #include <iostream> #include <limits> #include <random> int main() { std::mt19937 rng; std::seed_seq sequence{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; rng.seed(sequence); rng.discard(12 * 629143 + 6); float random = std::generate_canonical<float, std::numeric_limits<float>::digits>(rng); if (random == 1.0f) { std::cout << "Bug!\n"; } return 0; } 它给了我以下输出: Bug! 即,它为我提供了一个完美的解决方案1,这会导致我的MC集成出现问题。那是有效的行为还是我这边有错误?这将提供与G …
124 c++  c++11  random 

2
c ++ 11 lambda是否捕获不使用的变量?
当我[=]用来表示我希望通过lambda中的值捕获所有局部变量时,这是否会导致函数中的所有局部变量都被复制,或者仅仅是lambda使用的所有局部变量? 因此,例如,如果我有: vector<int> my_huge_vector(100000); int my_measly_int; some_function([=](int i){ return my_measly_int + i; }); 即使我不在lambda中使用my_huge_vector,它也会被复制吗?
123 c++  lambda  c++11 

3
使用此指针会在热循环中引起奇怪的反优化
最近,我遇到了一个奇怪的取消优化(或者说错过了优化机会)。 考虑使用此函数可以有效地将3位整数的数组拆包为8位整数。它在每次循环迭代中解压缩16个整数: void unpack3bit(uint8_t* target, char* source, int size) { while(size > 0){ uint64_t t = *reinterpret_cast<uint64_t*>(source); target[0] = t & 0x7; target[1] = (t >> 3) & 0x7; target[2] = (t >> 6) & 0x7; target[3] = (t >> 9) & 0x7; target[4] = (t >> 12) & 0x7; …

5
为什么C ++ 11不支持指定的初始化列表作为C99?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 2年前关闭。 改善这个问题 考虑: struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; } 上面的代码在C99中合法,但在C ++ 11中不合法。 什么是 C ++ 11 标准委员会排除支持此类方便功能的理由?
121 c++  c  c++11  initialization  c99 

6
错误:使用已删除的功能
我一直在研究一个朋友写的一些C ++代码,遇到以下错误,使用gcc4.6编译时从未见过: error: use of deleted function ‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed: uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’ 编辑:这来自使用Boost MSM的部分代码:Boost Webpage Edit2:= delete()源代码中的任何地方都没有使用过。 一般来说,此错误是什么意思?发生此类错误时我应该寻找什么?

2
std :: tie如何工作?
我std::tie没有考虑太多就用了。它有效,所以我刚刚接受了: auto test() { int a, b; std::tie(a, b) = std::make_tuple(2, 3); // a is now 2, b is now 3 return a + b; // 5 } 但是这个黑魔法如何工作?如何做一个临时的创建std::tie改变a和b?我发现这更有趣,因为它是库功能,而不是语言功能,因此可以肯定的是,我们可以自己实现并了解它。
120 c++  c++11  tuples 

2
将向量初始化为零C ++ / C ++ 11
我知道在C ++ 11中,他们添加了将变量初始化为零的功能 double number = {}; // number = 0 int data{}; // data = 0 是否有类似的方法将std::vector固定长度的a 初始化为全零?
118 c++  c++11 

7
C ++ 11中COW std :: string实现的合法性
据我了解,写时复制不是std::string在C ++ 11中实现符合性的可行方法,但是最近在讨论中出现时,我发现自己无法直接支持该声明。 我是否正确C ++ 11不允许基于COW的实现std::string? 如果是这样,此限制是否在新标准的某处(何处)明确说明? 或暗示此限制,是因为新要求的综合影响std::string使不能基于COW的实现std::string。在这种情况下,我会对“ C ++ 11有效禁止基于COW的std::string实现” 一章和诗句样式的衍生感兴趣。

1
为了避免昂贵的线程创建,C ++ 11中的async(launch :: async)是否会使线程池过时?
它与以下问题大致相关:std :: thread是否在C ++ 11中池化?。尽管问题有所不同,但目的是相同的: 问题1:使用自己的(或第三方库)线程池来避免创建昂贵的线程是否仍然有意义? 另一个问题的结论是,您不能依靠std::thread被池化(它可能会也可能不会)。但是,std::async(launch::async)似乎有更高的机会被合并。 它不认为这是标准的强制要求,但是恕我直言,我希望所有好的C ++ 11实现都可以在线程创建缓慢的情况下使用线程池。我希望仅在廉价的平台上创建新线程,我希望它们总是产生新线程。 问题2:这就是我的想法,但我没有事实可以证明。我很可能会误会。这是有根据的猜测吗? 最后,在这里,我提供了一些示例代码,这些代码首先显示了我认为如何通过async(launch::async)以下方式表达线程创建: 范例1: thread t([]{ f(); }); // ... t.join(); 变成 auto future = async(launch::async, []{ f(); }); // ... future.wait(); 示例2:触发并忘记线程 thread([]{ f(); }).detach(); 变成 // a bit clumsy... auto dummy = async(launch::async, []{ f(); }); // ... but …

4
如何在gcc中启用C ++ 11?
我在Mac OSX Mountain Lion上从http://hpc.sourceforge.net使用gcc 4.8.1 。我正在尝试编译使用中的to_string功能的C ++程序<string>。我需要-std=c++11每次使用该标志: g++ -std=c++11 -o testcode1 code1.cpp 有没有一种方法可以默认包含此标志?
117 c++11  g++ 


8
在运行时可以检测到C ++ 03和C ++ 11之间有什么区别(如果有)?
可以编写一个函数,当使用C编译器进行编译时,该函数将返回0,而使用C ++编译器进行编译时,该函数将返回1(用琐碎的处理 #ifdef __cplusplus是没有意义的)。 例如: int isCPP() { return sizeof(char) == sizeof 'c'; } 当然,以上内容仅sizeof (char)在与sizeof (int) 另一个更便携的解决方案是这样的: int isCPP() { typedef int T; { struct T { int a[2]; }; return sizeof(T) == sizeof(struct T); } } 我不确定这些示例是否100%正确,但是您可以理解。我相信还有其他方法可以编写相同的函数。 在运行时可以检测到C ++ 03和C ++ 11之间有什么区别(如果有)?换句话说,是否可以编写类似的函数来返回一个布尔值,该值指示该布尔值是由合格的C ++ 03编译器还是C ++ 11编译器编译的? bool isCpp11() …

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.