我正在使用C++0X标准中的自动功能,但我对如何做出类型决定感到困惑。考虑以下代码。structBase{virtualvoidf(){std::cout它将打印Base和Derived。但是为什么auto&被评估为对Derived的引用而不是对Base的引用?更糟糕的是把代码改成这样:structBase{};structDerived:publicBase{};intmain(){Base*dp=newDerived;autob1=*dp;auto&b2=*dp;std::cout返回两种类型的Base。那么为什么类型依赖于虚函数呢?我使用的编译器是VS2010。谁能给我一个提示,
我正在使用C++0X标准中的自动功能,但我对如何做出类型决定感到困惑。考虑以下代码。structBase{virtualvoidf(){std::cout它将打印Base和Derived。但是为什么auto&被评估为对Derived的引用而不是对Base的引用?更糟糕的是把代码改成这样:structBase{};structDerived:publicBase{};intmain(){Base*dp=newDerived;autob1=*dp;auto&b2=*dp;std::cout返回两种类型的Base。那么为什么类型依赖于虚函数呢?我使用的编译器是VS2010。谁能给我一个提示,
考虑到新的字符类型char8_t、char16_t和char32_twchar_t的命运是什么?/?更重要的是,std::wstring、std::wcout等呢?w*系列类(class)是否已弃用?是否有用于新字符类型的新std::ustring和std::Ustring类? 最佳答案 wchar_t没有任何变化,它仍然是特定于实现的(并且与C兼容)。新类型char16_t和char32_t在新标准中定义了语义。旧的wchar_t可能相当于其中之一,但在不同的实现中可能是不同的。或者在某些系统上都没有。对于新字符类型的字符串,您将
考虑到新的字符类型char8_t、char16_t和char32_twchar_t的命运是什么?/?更重要的是,std::wstring、std::wcout等呢?w*系列类(class)是否已弃用?是否有用于新字符类型的新std::ustring和std::Ustring类? 最佳答案 wchar_t没有任何变化,它仍然是特定于实现的(并且与C兼容)。新类型char16_t和char32_t在新标准中定义了语义。旧的wchar_t可能相当于其中之一,但在不同的实现中可能是不同的。或者在某些系统上都没有。对于新字符类型的字符串,您将
使用C++0x,当我在lambda中有一个lambda时,如何捕获一个变量?例如:std::vectorc1;intv=10;c2;std::for_each(c2.begin(),c2.end(),[v](intnum) 最佳答案 std::for_each(c1.begin(),c1.end(),[&](intnum){std::vectorc2;int&v_=v;std::for_each(c2.begin(),c2.end(),[&](intnum){v_=num;});});不是特别干净,但确实有效。
使用C++0x,当我在lambda中有一个lambda时,如何捕获一个变量?例如:std::vectorc1;intv=10;c2;std::for_each(c2.begin(),c2.end(),[v](intnum) 最佳答案 std::for_each(c1.begin(),c1.end(),[&](intnum){std::vectorc2;int&v_=v;std::for_each(c2.begin(),c2.end(),[&](intnum){v_=num;});});不是特别干净,但确实有效。
我非常相信我找到的解释是i=++iisnotundefined就C++0x而言,但我无法判断i+=++i的行为是否定义明确。有接盘侠吗? 最佳答案 使i=++i定义良好的推理同样可以用来证明i+=++i也必须是良好的——已定义。i+=++i等价于i+=(i+=1)并且新的排序规则要求赋值发生在i+=1子表达式的值计算之前。这意味着表达式i+=++i的结果必须与i=2*i+1的结果相同。编辑:我必须修改我的答案,因为行为毕竟是未定义的。i+=++i的行为是未定义的,因为子表达式i(左侧参数)和++的值计算i彼此之间是无序的,其中一个包
我非常相信我找到的解释是i=++iisnotundefined就C++0x而言,但我无法判断i+=++i的行为是否定义明确。有接盘侠吗? 最佳答案 使i=++i定义良好的推理同样可以用来证明i+=++i也必须是良好的——已定义。i+=++i等价于i+=(i+=1)并且新的排序规则要求赋值发生在i+=1子表达式的值计算之前。这意味着表达式i+=++i的结果必须与i=2*i+1的结果相同。编辑:我必须修改我的答案,因为行为毕竟是未定义的。i+=++i的行为是未定义的,因为子表达式i(左侧参数)和++的值计算i彼此之间是无序的,其中一个包
这是一个后续问题C++0xrvaluereferencesandtemporaries在上一个问题中,我问过这段代码应该如何工作:voidf(conststd::string&);//lessefficientvoidf(std::string&&);//moreefficientvoidg(constchar*arg){f(arg);}由于隐式临时性,似乎应该调用移动重载,这发生在GCC而不是MSVC(或MSVC的智能感知中使用的EDG前端)。这段代码怎么样?voidf(std::string&&);//NB:Noconststring&overloadsuppliedvoidg1(
这是一个后续问题C++0xrvaluereferencesandtemporaries在上一个问题中,我问过这段代码应该如何工作:voidf(conststd::string&);//lessefficientvoidf(std::string&&);//moreefficientvoidg(constchar*arg){f(arg);}由于隐式临时性,似乎应该调用移动重载,这发生在GCC而不是MSVC(或MSVC的智能感知中使用的EDG前端)。这段代码怎么样?voidf(std::string&&);//NB:Noconststring&overloadsuppliedvoidg1(