【发布时间】:2014-09-22 16:51:04
【问题描述】:
问题最初出现在this question。考虑以下代码:
class Var
{
public:
operator int () const
{ return 0; }
template <typename T>
operator T () const
{ return T(); }
};
int main()
{
Var v;
switch (v)
{ }
}
没有operator int() const { return 0; },g++ 和clang reject 的代码。
但是,上面带有operator int() 的代码是clang 的accepted,而g++ 的rejected 则出现以下错误:
main.cpp:17:14: error: default type conversion can't deduce template argument for 'template<class T> Var::operator T() const'
switch (v)
^
哪个编译器是正确的?
【问题讨论】:
-
switch语句可以切换多种类型,不仅仅是
int。 -
从标准的措辞看来,不应执行重载解析,并且实际上只需要一个可能的函数来执行转换。这将使 g++ 正确。但是,我不确定。
-
我更新了我的答案,我发现
N3323涵盖了围绕上下文转换 的逻辑,它强烈指出clang在这个问题上是正确的。 -
@T.C. , ShafikYaghmour 好吧,如果我们看一下 clang++、g++ 和 msvc++ 这三个编译器,它们各自的“C++11”模式(或者,msvc++ 的默认模式)包含了一些针对标准中缺陷的建议解决方案。如果我们仅将 C++11 视为已作为标准发布的内容,那么 N3485 就不是“C++11 草案”。如果我们看一下 C++11 的预期,或者有修复但没有添加,我确实认为 N3485 可以用来谈论 C++11。无论如何,C++11 的含义有多种定义。
-
我为此提交了gcc bug report,抄送@dyp
标签: c++ c++11 language-lawyer implicit-conversion c++14