提问人:user2621476 提问时间:8/17/2016 最后编辑:Peter Kuser2621476 更新时间:8/18/2016 访问量:133
复制构造函数给出编译错误
copy constructor gives compilation error
问:
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赞
Peter K
8/17/2016
#1
如注释中所述,您不能将临时对象绑定到非常量引用。
在以下情况下:
print_me_bad( std::string( "World" ) ); // Compile error
print_me_bad( "!" ); // Compile error;
创建一个临时 std::string 对象。首先是显式 (),然后通过隐式转换 ( 转换为 std::string)。这是不允许的。std::string( "World" )
"!"
但是,您可以将临时引用绑定到 const 引用,这就是为什么其他情况编译得很好的原因:
print_me_good( std::string( "World" ) ); // Compiles ok
print_me_good( "!" ); // Compiles ok
评论
const