void print_me_bad( std::string& s ) {
std::cout << s << std::endl;
}
void print_me_good( const std::string& s ) {
std::cout << s << std::endl;
}
std::string hello( "Hello" );
print_me_bad( hello ); // Compiles ok
print_me_bad( std::string( "World" ) ); // Compile error
print_me_bad( "!" ); // Compile error;
print_me_good( hello ); // Compiles ok
print_me_good( std::string( "World" ) ); // Compiles ok
print_me_good( "!" ); // Compiles ok
在上面的复制构造函数程序中,为什么我在传递“World”时会在第二种情况下出现编译错误?
答案 0 :(得分:0)
如评论中所述,您无法将临时对象绑定到非const引用。
在以下情况中:
print_me_bad( std::string( "World" ) ); // Compile error
print_me_bad( "!" ); // Compile error;
您创建一个临时的std :: string对象。首先显式(std::string( "World" )
),然后通过隐式转换("!"
转换为std :: string)。这是不允许的。
但是,您可以将临时对象绑定到const引用,这就是其他情况编译得很好的原因:
print_me_good( std::string( "World" ) ); // Compiles ok
print_me_good( "!" ); // Compiles ok