在Bjarne Stroustrup的"C++编程语言"第4版36.3.6 STL类操作部分中,以下代码用作链接示例:
void f2()
{
std::string s = "but I have heard it works even if you don't believe in it" ;
s.replace(0, 4, "" ).replace( s.find( "even" ), 4, "only" )
.replace( s.find( " don't" ), 6, "" );
assert( s == "I have heard it works only if you believe in it" ) ;
}
Run Code Online (Sandbox Code Playgroud)
断言失败gcc(看到它直播)和Visual Studio(看到它的实时),但它在使用Clang时没有失败(请参见实时).
为什么我会得到不同的结果?这些编译器是否错误地评估了链接表达式,或者此代码是否表现出某种形式的未指定 …
c++ operator-precedence language-lawyer unspecified-behavior c++11
在典型的C++代码中,C++ 17评估顺序保证(P0145)投票的含义是什么?
对于像这样的事情,它有什么变化
i=1;
f(i++, i)
Run Code Online (Sandbox Code Playgroud)
和
std::cout << f() << f() << f() ;
Run Code Online (Sandbox Code Playgroud)
要么
f(g(),h(),j());
Run Code Online (Sandbox Code Playgroud) 更新:由用户ecatmur标记,它是In C99的副本,f()+ g()未定义或仅仅未指定?(虽然问题询问C99,但C++的答案没有变化).答案是:未指定(两种情况).
考虑以下C++ 14代码片段:
int i = 0;
int x() { i++; return i;}
int y() { i++; return i;}
bool z = (x() > y()); // unspecified or undefined ?
Run Code Online (Sandbox Code Playgroud)
z 仅仅是未指定的值,还是这种未定义的行为?
根据我的理解(请纠正,如果我错了),这种类型的表达式:i++ > i++将是未定义的行为,因为我们在一对序列点之间两次改变相同的变量,但是上面的情况如何(突变发生在单独的功能) ?
那一个怎么样:
bool z = (x() > i++); // undefined or unspecified now ?
Run Code Online (Sandbox Code Playgroud)