【发布时间】:2013-01-26 10:14:56
【问题描述】:
我很难理解下面代码中的调用顺序。 我期待看到下面的输出
A1B2
虽然我可以看到我得到的输出是
BA12
我以为调用std::cout<< b->fooA() << b->fooB() << std::endl就相当于调用
std::cout.operator<<( b->fooA() ).operator<< ( b->fooB() )
但我可以看到情况并非如此。你能帮助我更好地理解它是如何工作的以及与全球operator<< 的关系吗?这是此序列中最后一次调用的吗?
#include <iostream>
struct cbase{
int fooA(){
std::cout<<"A";
return 1;
}
int fooB(){
std::cout <<"B";
return 2;
}
};
void printcbase(cbase* b ){
std::cout << b->fooA() << b->fooB() << std::endl;
}
int main(){
cbase b;
printcbase( &b );
}
【问题讨论】:
-
您认为它与此等价是正确的。但是,您错误地假设存在明确定义的评估顺序。没有。就是这样。
-
这里不保证子表达式求值的顺序(它必须是重复的,但我现在找不到一个好的规范问题)
-
AB12或BA12是可能的输出。A1B2不是(希望如此)。 -
不完全重复,但这个问题的答案确实解释了您遇到的未指定顺序。 What is the correct answer for cout << c++ << c;?
-
@jrok 是的,是的。 (假设
标签: c++ stream operator-keyword cout ostream