7

我认为以下代码应该会产生错误:

#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 类型的变量不存在)。

有没有人解释为什么代码编译成功?

提前致谢。

4

2 回答 2

12

是的,给定一个对常量的引用,编译器可以/将合成一个临时(在这种情况下是 type std::string)并将引用绑定到该临时。

但是,如果引用不是对 const 对象,那将不起作用——只有对 const 的引用才能绑定到这样的临时对象(尽管至少广泛使用的编译器允许非常量引用绑定到引用以及)。

于 2012-07-02T06:59:50.043 回答
3

你遇到的是隐式转换。

这是来自 C++ 标准的引用 (SC22-N-4411.pdf)

1 类对象的类型转换可以由构造函数和转换函数指定。这些转换称为用户定义的转换,用于隐式类型转换(第 4 条)、初始化(8.5)和显式类型转换(5.4、5.2.9)。

所以编译器只是按预期工作并调用std::string你提到的构造函数。

于 2012-07-02T07:03:34.087 回答