草庐IT

行为树

全部标签

c++ - GCC 和 clang (SFINAE) 之间的重载解析行为差异

GCC接受以下代码:templatestructmeta{typedeftypenameT::typetype;};structS{};templatetypenamemeta::typefoo(T,S);intfoo(int,int);intmain(){foo(0,0);}但是clang拒绝它并出现以下错误:test.cpp:4:22:error:type'int'cannotbeusedpriorto'::'becauseithasnomemberstypedeftypenameT::typetype;^test.cpp:10:10:note:ininstantiationoft

c++ - GCC 和 clang (SFINAE) 之间的重载解析行为差异

GCC接受以下代码:templatestructmeta{typedeftypenameT::typetype;};structS{};templatetypenamemeta::typefoo(T,S);intfoo(int,int);intmain(){foo(0,0);}但是clang拒绝它并出现以下错误:test.cpp:4:22:error:type'int'cannotbeusedpriorto'::'becauseithasnomemberstypedeftypenameT::typetype;^test.cpp:10:10:note:ininstantiationoft

c++ - constexpr 未定义行为

我一直在试验constexpr。在我的测试编译器(g++4.6)上,这无法编译,出现关于越界访问的错误。编译器需要在编译时发现这个吗?#includeconstexprconstchar*str="hi";constexprintfail(){returnstr[1000];//Waypasttheend!}templatestructfoo{staticvoidprint(){std::cout::print();} 最佳答案 §5.19/2(在第二页;它确实应该分成很多段)禁止包含的常量表达式—anlvalue-to-rvalu

c++ - constexpr 未定义行为

我一直在试验constexpr。在我的测试编译器(g++4.6)上,这无法编译,出现关于越界访问的错误。编译器需要在编译时发现这个吗?#includeconstexprconstchar*str="hi";constexprintfail(){returnstr[1000];//Waypasttheend!}templatestructfoo{staticvoidprint(){std::cout::print();} 最佳答案 §5.19/2(在第二页;它确实应该分成很多段)禁止包含的常量表达式—anlvalue-to-rvalu

c++ - C++03 和 C++11 之间的未定义行为有什么区别?

新标准与旧标准具有不同的未定义行为。例如,新的排序规则意味着一些以前未定义的算术运算(由于序列点之间的多次写入等原因)现在被定义了。那么,对于未定义的行为,我们需要重新学习什么? 最佳答案 在我看来,新规则更难描述和理解。例如考虑:intx=12;x=x+++1;//undefinedbehaviourx=++x+1;//valid我建议在同一个表达式中简单地避免对同一个变量产生多个副作用,这是一个更易于理解的规则。AFAIKC++0X改变了一些过去未定义行为而现在合法使用的情况(例如上面两个表达式中的第二个),但请记住,什么是合法

c++ - C++03 和 C++11 之间的未定义行为有什么区别?

新标准与旧标准具有不同的未定义行为。例如,新的排序规则意味着一些以前未定义的算术运算(由于序列点之间的多次写入等原因)现在被定义了。那么,对于未定义的行为,我们需要重新学习什么? 最佳答案 在我看来,新规则更难描述和理解。例如考虑:intx=12;x=x+++1;//undefinedbehaviourx=++x+1;//valid我建议在同一个表达式中简单地避免对同一个变量产生多个副作用,这是一个更易于理解的规则。AFAIKC++0X改变了一些过去未定义行为而现在合法使用的情况(例如上面两个表达式中的第二个),但请记住,什么是合法

c++ - 评估顺序和未定义行为

在C++11标准的上下文中(如你所知,它不再有序列点的概念)我想了解两个最简单的示例是如何定义的。inti=0;i=i++;//#0i=++i;//#1有两个关于SO的主题解释了C++11上下文中的这些示例。Here据说#0调用UB并且#1是明确定义的。Here据说这两个例子都没有定义。这种模棱两可让我很困惑。我读过这篇结构良好的reference已经三遍了,但这个话题对我来说似乎太复杂了。.我们来分析例子#0:i=i++;.相应的引号是:Thevaluecomputationofthebuilt-inpostincrementandpostdecrementoperatorsisse

c++ - 评估顺序和未定义行为

在C++11标准的上下文中(如你所知,它不再有序列点的概念)我想了解两个最简单的示例是如何定义的。inti=0;i=i++;//#0i=++i;//#1有两个关于SO的主题解释了C++11上下文中的这些示例。Here据说#0调用UB并且#1是明确定义的。Here据说这两个例子都没有定义。这种模棱两可让我很困惑。我读过这篇结构良好的reference已经三遍了,但这个话题对我来说似乎太复杂了。.我们来分析例子#0:i=i++;.相应的引号是:Thevaluecomputationofthebuilt-inpostincrementandpostdecrementoperatorsisse

c++ - 为什么绑定(bind)到引用类型时 "const auto [x, y]"的行为不符合预期?

以下代码片段摘自cppref:std::tuplef();auto[x,y]=f();//decltype(x)isint//decltype(y)isint&constauto[z,w]=f();//decltype(z)isconstint//decltype(w)isint&我的问题在最后一行:为什么是decltype(w)int&而不是constint&? 最佳答案 Jarod42回答了评论中的问题,让我在这里引用标准的相关部分,来自[dcl.struct.bind]¹:GiventhetypeTidesignatedbys

c++ - 为什么绑定(bind)到引用类型时 "const auto [x, y]"的行为不符合预期?

以下代码片段摘自cppref:std::tuplef();auto[x,y]=f();//decltype(x)isint//decltype(y)isint&constauto[z,w]=f();//decltype(z)isconstint//decltype(w)isint&我的问题在最后一行:为什么是decltype(w)int&而不是constint&? 最佳答案 Jarod42回答了评论中的问题,让我在这里引用标准的相关部分,来自[dcl.struct.bind]¹:GiventhetypeTidesignatedbys