使用标准构造函数传递临时对象

Dej*_*jwi 4 c++ constructor temporary-objects

我想将一个临时对象(例如std :: string)传递给我的对象的构造函数:

class MyClass{
  public:
    MyClass(string a):
      a(a)
    {

    }
    string a;
};

int main(int argc, char *argv[]){
  MyClass a(string());
  cout<<a.a<<endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

main.cpp: In function ‘int main(int, char**)’:
main.cpp:28:11: error: request for member ‘a’ in ‘a’, which is of non-class type ‘MyClass(std::string (*)()) {aka MyClass(std::basic_string<char> (*)())}’
Run Code Online (Sandbox Code Playgroud)

如果我将任何东西传递给临时对象的构造函数(例如string("")),一切正常.为什么?

Set*_*gie 9

这是被称为C++ 最令人烦恼的解析的实例.编译器解释

MyClass a(string());
Run Code Online (Sandbox Code Playgroud)

作为一个名为areturn a MyClass和取无名 string作为参数的函数的原型.

你可以通过在strings构造函数的调用周围加括号来消除歧义:

MyClass a((string()));
Run Code Online (Sandbox Code Playgroud)

或者,只要MyClass具有可访问的复制构造函数:

MyClass a = string();
Run Code Online (Sandbox Code Playgroud)

更新C++ 11

您也可以使用通用初始化语法消除歧义,只要您的类没有构造函数接受initializer_list:

MyClass a { string() };
Run Code Online (Sandbox Code Playgroud)

  • 这是说"编译器把'MyClass的一个(字符串())’为命名的'A’返回'MyClass的’,并采取一个无名'字符串’作为参数.函数的原型" 这是不正确的.应该说,编译器将其解释为函数的原型名为"一个"返回"MyClass的",并采取*功能以"串"返回值*作为其唯一的(未命名)参数. (2认同)