引用变量的声明需要初始化器

bob*_*obo 4 c++

我已经将我的真实程序简化为一个玩具示例。

假设我有以下代码:

struct A
{
  A( string i ) { }
  A( string *i ) { }
};

int main()
{
  string s;
  A("HELLO"); // Works
  A(&s); // XCode: Declaration of reference variable 's' requires an initializer
  // Visual Studio: error C2040: 's': 'A &' differs in levels of indirection from 'std::string'
}
Run Code Online (Sandbox Code Playgroud)

我不明白错误消息。XCode“引用变量的声明需要初始化程序”是什么意思?为什么A("HELLO");有效而A(&s)无效?

Fur*_*ish 7

这是一种称为最令人烦恼的解析的现象。

C++ 将其A(&s);视为名为 的变量的声明s,其类型为A&。由于以下几个原因,这不起作用:

  • 引用需要初始化,但s在此示例中您并未初始化(注意:这与之前 2 行中的引用s不同)。s

  • s您已经在同一范围内调用了一个变量,因此这将是一个重新定义。

要创建一个更小的示例,请看一下这两行等效的代码,它们都声明了一个名为xof 类型的变量int

int x;
int(x);
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以简单地使用使用所需构造函数的正确声明,这样就不会遇到最麻烦的解析问题:

A x1(&s); // this
auto x2 = A(&s); // or this
A{&s}; // or this, just to create a temporary
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在 C++11 或更高版本中,`A{&s};` 将被正确解析。 (4认同)