Cli*_*ton 3 c++ most-vexing-parse
为什么这段代码可以删除A的所有副本?
#include <iostream>
class A
{
public:
A() {}
A(const A&) { std::cout << "Copy" << std::endl; }
};
class B
{
public:
B(const A& a_) : a(a_) {}
private:
A a;
};
int main()
{
B b(A());
}
Run Code Online (Sandbox Code Playgroud)
这段代码显然没有复制A,并且在ideone的gcc 3.4下没有输出任何内容.
问题不是复制省略,而是声明的含义:
B b(A());
// To get it working the way you expect [1]
B b = B(A());
// Or the slightly more obtuse.
B b((A()));
Run Code Online (Sandbox Code Playgroud)
编译器是一个函数声明.Google /搜索SO以获取最令人烦恼的解析.更多关于C++ FAQ lite的内容,包括解决方法.
[1]:这不完全相同,因为这需要隐式转换A为B.如果B被定义为:
class B {
A a;
public:
explicit B(const A& a_) : a(a_) {}
};
Run Code Online (Sandbox Code Playgroud)
那么这不是一个替代方案.
B b(A());
Run Code Online (Sandbox Code Playgroud)
你认为这声明了一个变量?没有.
它声明了一个b返回类型为的函数,B并接受一个类型的参数A (*)().
看这个主题:
因此,如果您想声明一个变量,请将额外的括号放在A():
B b((A())); //it declares an object
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |