项目场景:
无
问题描述
提示:这里描述项目中遇到的问题:
cpp中的陷阱
class A
{
public:
std::string str;
A(const std::string& str):str(str) {}
};
int main()
{
char ch[] = "abc";
A a(std::string(ch)); // A a(std::string ch); (1)
// A a(std::string{ch}); (2)
std::cout << a.str << std::endl;
}
A a(std::string(ch)); // A a(std::string ch); (1)
上面的写法不太好看出来,换下面的写法就看出来了
A a(std::string (ch) ); // A a(std::string ch); (1)
// A a(int (ch) ) <=> A a(int ch)
原因分析:
(1)的语句在编译器中被解析为函数声明:A a(std::string ch);
形似T1 name(T2 (namex) );
会被编译器解析成T1 name(T2 namex);
的函数声明
解决方案:
如(2)所示,利用初始化列表初始化,所以善用初始化列表
A a( std::string{ch} );
总结:
不要写奇奇怪怪的语法就是了