我认为以下代码会产生错误:
#include <iostream>
#include <string>
static void pr(const std::string &aStr)
{
std::cout << aStr << "\n";
}
int main(void)
{
const char *a = "Hellu";
pr(a);
return 0;
}
但是gcc 4.1.2会成功编译它。
std :: string的构造函数是否妨碍了,创建了std :: string的实例?
我认为它不应该,因为引用只是变量的别名(在这种情况下,没有引用引用的std :: string类型的变量)。
有人在那里解释代码成功编译的原因吗?
提前致谢。
答案 0 :(得分:10)
是的,给定对常量的引用,编译器可以/将合成一个临时(在这种情况下类型为std::string
)并将引用绑定到该临时。
但是,如果引用不是const对象,则不起作用 - 只有对const的引用才能绑定到这样的临时对象(尽管至少广泛使用的编译器允许非const引用绑定参考也是如此。
答案 1 :(得分:2)
您遇到的是隐式转换。
以下是C ++标准(SC22-N-4411.pdf)
的引用1类对象的类型转换可以由构造函数和转换函数指定。这些转换称为用户定义的转换,用于隐式类型转换(第4节),初始化(8.5)和显式类型转换(5.4,5.2.9)。
因此编译器只是按预期工作并调用您提到的std::string
构造函数。