我已经将我的真实程序简化为一个玩具示例。
假设我有以下代码:
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)无效?
这是一种称为最令人烦恼的解析的现象。
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)
| 归档时间: |
|
| 查看次数: |
4680 次 |
| 最近记录: |