(注意:这个问题是关于不必指定元素的数量,仍然允许直接初始化嵌套types。) 这个问题讨论了C数组的用法,比如int arr[20]; 。 在他的回答中 ,@James Kanze展示了C数组的最后一个据点之一,它是独特的初始化特性: int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 }; 我们不必指定元素的数量,万岁! 现在用<iterator> ( 或你自己的变体 )的C ++ 11函数std::begin和std::end <iterator> ,你甚至不需要考虑它的大小。 现在,有没有(可能是TMP)的方式来实现相同的std::array ? 使用macros可以使它看起来更好。 🙂 ??? std_array = { "here", "be", "elements" }; 编辑 :从各种答案编译的中级版本,看起来像这样: #include <array> #include <utility> template<class T, […]
std::decay存在的原因是什么? std::decay在什么情况下有用?
是否有可能通过在lambdaexpression式中的const引用捕获? 我想要下面标记的任务失败,例如: #include <cstdlib> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string strings[] = { "hello", "world" }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = "foo"; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string = s; // this should fail } ); return 0; } 更新:由于这是一个老问题,如果C ++ 14中有设施来帮助解决这个问题,可能会更新它。 […]
可以编写一个函数,当使用C编译器编译时,它将返回0,当使用C ++编译器编译时,函数将返回1(使用#ifdef __cplusplus的平凡的#ifdef __cplusplus不是很有趣)。 例如: int isCPP() { return sizeof(char) == sizeof 'c'; } 当然,只有当sizeof (char)和sizeof (int)不一样时, 另一个更便携的解决scheme是这样的: int isCPP() { typedef int T; { struct T { int a[2]; }; return sizeof(T) == sizeof(struct T); } } 我不确定这些例子是否100%正确,但是你明白了。 我相信还有其他的方法来编写相同的function。 在运行时可以检测到C ++ 03和C ++ 11之间有什么区别? 换句话说,是否有可能编写一个类似的函数,它会返回一个布尔值,表示它是否由符合的C ++ 03编译器或C ++ 11编译器编译? bool isCpp11() { //??? }
我无法理解智能指针在C ++ 11中作为类成员的用法。 我读了很多关于智能指针的信息,我想我明白unique_ptr和shared_ptr / weak_ptr如何工作的。 我不明白的是真正的用法。 似乎每个人都推荐使用unique_ptr作为几乎所有的时间。 但是,我将如何实现这样的东西: class Device { }; class Settings { Device *device; public: Settings(Device *device) { this->device = device; } Device *getDevice() { return device; } }; int main() { Device *device = new Device(); Settings settings(device); // … Device *myDevice = settings.getDevice(); // do something with myDevice… } […]
我想写这个 typedef void (*FunctionPtr)(); 使用using 。 我该怎么做?
我很惊讶这没有出现在我的search结果中,我以为有人会问这之前,考虑到在C + + 11的移动语义的有用性: 我什么时候需要(或者对我来说是一个好主意)在C ++ 11中创build一个不可移动的类? (除现有代码的兼容性问题之外的原因,即。)
我看到这里: 移动构造函数调用基类移动构造 有人可以解释: std::move和std::forward之间的区别,最好用一些代码示例? 如何轻松考虑,何时使用哪个
从我在这篇文章中看到的,我决定开始阅读有效的C ++的书。 但是现在由于C ++ 11有许多新function,并且有一些好的做法改变了,所以我不确定这是否是一个好主意。 C ++ 11的出现是否反对Effective C ++中包含的任何build议? 如果是的话,我应该避免哪些话题?
auto foo = "You're using g++!"; auto compiler_detector = [foo](auto foo) { std::puts(foo); }; compiler_detector("You're using clang++!"); 铿锵声++ 3.6.0和更新的打印出“你正在使用铛++!” 并警告捕捉 foo未被使用。 g ++ 4.9.0和更新版本打印出“您正在使用g ++!” 并警告参数 foo未被使用。 什么编译器在这里更精确地遵循C ++标准? wandbox例子