C++创建临时对象问题?

Amelie
  • 74
#include <iostream>
#include <string>
using namespace std;

struct A {
    A(const char *cp) { cout<<"字符串数组"<<endl; }
    A(const string &str) { cout<<"stirng"<<endl; }
};

int main()
{
    string str("sdfsd");
    A("sdfsd");
    // A(str);
    
    return 0;
}

这是一个创建临时对象的问题:
问下,为什么 A("sdfsd"); 能正确创建对象,
A(str); 就会编译出错呢?

评论
阅读 848
2 个回答
✓ 已被采纳

通常,声明变量会使用 int a; 。但是,使用 int (a); 同样是合法的。

于是,A(str); 就有了两种可能的解释,声明一个变量 str,类型为 A ;或者构造一个类型为 A 的临时变量,并将 str 作为构造函数的参数。在有这种歧义的时候,C++ 总是认为这是一个变量声明。

A("absf") 并没有这种歧义,它不能被解释为变量声明。

A(str)会被解析成A str导致和string str同名不同类型重复定义,避免这种解析有很多方法

A a(str);
A((string)str);
A{str};  //等等
宣传栏