【发布时间】:2017-01-30 12:14:05
【问题描述】:
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";
}
【问题讨论】:
-
no known conversion from const char [5]' to 'A' for 1st argument如果您想询问此错误,您需要发布重现此错误的代码。这段代码没有。 -
你只得到 one 用户定义的转换,并且你的代码要求 two:一个从
"test"到A,和一个从A到B。 -
@nm 看看上面带有clang 3.9.1的godbolt示例,看看clang显示的提示。
-
抱歉误读了代码。 Clang 说
note: candidate constructor not viable: no known conversion from 'const char [5]' to 'A' for 1st argument是因为它不考虑用户定义的转换,这是因为它试图解决不同的用户定义的转换。
标签: c++ visual-c++ clang++