Clang版本:X86-64 clang 3.9.1
VC ++版本:x86-64 CL 19 RC
我希望它会编译,因为const char *可以隐含地转换为A而A可以转换为B.有趣的是clang声明const char [5]不能转换为A?注意:我现在理解它不是标准行为,但我仍然想知道VC ++接受此代码的原因,即哪种语言扩展导致它?
clang给出的错误:
no viable conversion from 'const char [5]' to 'B'
clang给出的提示:
note: candidate constructor not viable: no known conversion from 'const char [5]' to 'A' for 1st argument
note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'const char [5]' to 'const B &' for 1st argument
#include <string>
#include <vector>
struct A
{
std::string m_test;
A(const char* test)
: m_test(test)
{
}
};
struct B
{
A m_a;
B( A a )
: m_a(a)
{
}
};
int main()
{
B test = "test";
}
答案 0 :(得分:4)
只允许一个隐式的用户定义转换,请参阅[class.conv] / 4:
最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。
所以它似乎是一个Microsoft C ++扩展,实际上,如果你禁用MSVC扩展(/Za
),你会得到同样的错误:
error C2440: 'initializing': cannot convert from 'const char [5]' to 'B'
至于原因 - 它看起来像某种“多个隐式转换”扩展,但在文档中没有提到它。甚至还有一个bug submitted,它应该是固定的,但我想这没有用。