Tag: c ++ 11

to_string不是std的成员,说g ++(mingw)

我正在制作一个小型的词汇记忆程序,在这个程序中,词语会随机地闪现在我的意思之中。 我想用Bjarne Stroustroup告诉我们的标准C ++库,但是我遇到了一个看起来很奇怪的问题。 我想更改一个long整型为std::string以便能够将其存储在一个文件中。 我已经雇用to_string()为相同。 问题是,当我用g ++(在版本标志中提到的版本4.7.0)编译它时,它说: PS C:\Users\Anurag\SkyDrive\College\Programs> g++ -std=c++0x ttd.cpp ttd.cpp: In function 'int main()': ttd.cpp:11:2: error: 'to_string' is not a member of 'std' 我的程序出现这个错误是: #include <string> int main() { std::to_string(0); return 0; } 但是,我知道这不可能,因为MSDN库明确表示它存在,堆栈溢出(对于g ++版本4.5) 早期的问题说,它可以用-std=c++0x标志打开。 我究竟做错了什么?

遍历元组

我如何迭代一个元组(使用C ++ 11)? 我尝试了以下,但是这不起作用: for(int i=0; i<std::tuple_size<T…>::value; ++i) std::get<i>(my_tuple).do_sth(); 错误1:抱歉,未实现:无法将“侦听器…”扩展为固定长度的参数列表。 错误2:我不能出现在一个常量expression式中。 那么,如何正确地迭代元组呢?

检查一个类是否有给定签名的成员函数

我要求一个模板技巧来检测一个类是否具有给定签名的特定成员函数。 这个问题类似于http://www.gotw.ca/gotw/071.htm中的一个,但不一样:在Sutter的书中,他回答了C类必须提供成员函数的问题一个特殊的签名,否则程序将不能编译。 在我的问题,我需要做一些事情,如果一个类有这个function,否则做“别的东西”。 boost :: serialization也面临类似的问题,但我不喜欢他们采用的解决scheme:一个模板函数默认调用一个自由函数(你必须定义)一个特定的签名,除非你定义一个特定的成员函数在他们的情况下,使用特定types的2个参数进行“序列化”),否则会发生编译错误。 那就是实现侵入式和非侵入式序列化。 我不喜欢这个解决scheme有两个原因: 要非侵入性,你必须覆盖boost :: serialization命名空间中的全局“serialize”函数,所以你有你的客户端代码来打开命名空间提升和命名空间序列化! 解决这个混乱的堆栈是10到12个函数调用。 我需要为没有该成员函数的类定义一个自定义行为,并且我的实体位于不同的名称空间中(并且我不想在另一个名称空间中重写在一个名称空间中定义的全局函数) 你能给我一个解决这个难题的提示吗?

在C ++ 11中本地静态variables初始化是线程安全的吗?

我知道这是一个经常被问到的问题,但是由于有很多变种,我想重新说明它,并希望有一个反映当前状态的答案。 就像是 Logger& g_logger() { static Logger lg; return lg; } variableslg的构造函数保证只运行一次? 我从以前的答案中知道,在C ++ 03中,这不是; 在C ++ 0x草案中,这是强制执行的。 但我想要一个更清晰的答案 在C ++ 11标准(不是草案)中,线程安全的初始化行为是否已经完成? 如果以上是肯定的,那么在当前stream行编译器的最新版本中,即gcc 4.7,vc 2011和clang 3.0,它们是否被正确实现?

有没有可能找出lambda的参数types和返回types?

给定一个lambda,是否有可能找出它的参数types和返回types? 如果是的话,怎么样? 基本上,我想lambda_traits可以用于以下方面: auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long 背后的动机是,我想在接受lambda作为参数的函数模板中使用lambda_traits ,我需要知道它的参数types和函数内的返回types: template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //… } 目前,我们可以假设lambda只需要一个参数。 最初,我试图使用std::function作为: template<typename T> […]

为什么我应该使用指针而不是对象本身?

我来自Java背景,已经开始使用C ++中的对象。 但有一件事发生在我身上,人们经常使用指向对象的指针而不是对象本身,例如这个声明: Object *myObject = new Object; 而不是: Object myObject; 或者使用一个函数,比如testFunc() ,就像这样: myObject.testFunc(); 我们必须写: myObject->testFunc(); 但是我不明白为什么要这样做。 我会假设它与效率和速度有关,因为我们可以直接访问内存地址。 我对吗?

我使用哪种指针?

好的,所以最后一次我写C ++为生, std::auto_ptr是所有的std lib都可用的,而boost::shared_ptr是所有的愤怒。 我从来没有真正看过其他提供的智能指针types提升。 我明白,C ++ 11现在提供了一些types的提升,但不是全部。 那么有人有一个简单的algorithm来确定何时使用哪个智能指针? 优选地包括关于哑指针(诸如T*原始指针)和其余的升压智能指针的build议。 (这样的事情会很棒)。

什么是nullptr?

我们现在拥有许多新function的C ++ 11。 一个有趣和令人困惑的(至less对我来说)是新的nullptr 。 好了,再也不需要讨厌的macrosNULL 。 int* x = nullptr; myclass* obj = nullptr; 不过,我没有得到如何nullptr作品。 例如, 维基百科文章说: C ++ 11通过引入一个新的关键字来作为一个可区分的空指针常量来纠正这个问题:nullptr。 它的types是nullptr_t ,它可以隐式转换,并且可以和任何指针types或成员指针types进行比较。 除了bool之外,它不是可以转换的,也不可以与整数types相比较。 它是怎样的一个关键字和一个types的实例? 另外,你是否还有另外一个例子(维基百科之外), nullptr优于0 ?

C ++标准是否在C ++ 14中使用了不确定的值和未定义的行为?

如在初始化中涉及左值到右值的转换? 是int x = x; UB? C ++标准在第3.3.2节的声明中有一个令人惊讶的例子,其中一个int用它自己的不确定值进行初始化: int x = 12; { int x = x; } 这里第二个x是用自己的(不确定的)值初始化的。 – 结束示例 ] 哪个Johannes回答这个问题表明是未定义的行为,因为它需要一个左值到右值的转换。 在最新的C ++ 14草案标准N3936可以在这里find这个例子已经改为: unsigned char x = 12; { unsigned char x = x; } 这里第二个x是用自己的(不确定的)值初始化的。 – 结束示例 ] 在C ++ 14中,在不确定的值和未定义的行为方面有什么改变,导致了这个例子的改变?

Eclipse CDT C ++ 11 / C ++ 0x支持

Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2 这是一个C ++ 11代码的例子: auto text = std::unique_ptr<char[]>(new char[len]); Eclipse编辑器抱怨: Function 'unique_ptr' could not be resolved Makefile编译工作正常。 如何让Eclipse停止抱怨这类错误?