根据我对C++的了解,我提出了一个无法解释的问题。
我有一个类,它恒定引用类型X的结构,但是当我传递类型X的参数(之前已初始化)时,我从编译器中收到一个错误,说它无法转换为成员的第一个成员X。这对我来说没有任何意义。
该错误在clang和g++中相似,这使我认为我缺少了一些过分的东西。error: no viable conversion from 'const Foo::X' to 'Foo::FooTypes'
为什么要尝试从X转换为Z的第一个成员FooTypes?
class Foo {
public:
enum FooTypes {
JPEG
};
struct Z {
FooTypes type;
int a;
};
struct X {
Z caps;
double host_address;
};
Foo(const X& x);
private:
const X x;
};
Foo::Foo(const Foo::X& x) :
x{x} {
}
int main() {
Foo::X new_x = {
{Foo::JPEG, 1}, 1.58 };
Foo *s = new Foo(new_x);
delete s;
return 0;
}
最佳答案
您应该使用圆括号而不是大括号:
...
const X m_x;
};
Foo::Foo(const Foo::X& x) :
m_x(x) {
}
...
这是列表初始化:
...
m_x{x.caps, x.host_address}
...
编辑
@PauloNeves
我刚刚找到了Bjarne Stroustrup的文档http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdf,其中包含下一个定义:
我认为描述的成员初始化是您的情况。对我而言,它看起来像g++ 4.9缺陷。
关于c++ - 结构初始化中隐式拷贝构造函数出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34422739/