【发布时间】:2018-11-29 08:56:47
【问题描述】:
为什么允许在 C++ 中编译以下内容?
#include<iostream>
using namespace std;
class mytest
{
public:
operator int()
{
return 10;
}
operator const int()
{
return 5;
}
};
int main()
{
mytest mt;
//int x = mt; //ERROR ambigious
//const int x = mt; //ERROR ambigious
}
为什么允许编译转换运算符的不同版本(基于常量)是有意义的,因为它们的使用总是会导致歧义?
有人可以澄清我在这里缺少什么吗?
【问题讨论】:
-
一个猜测:没有人足够关心列出稍微有用和完全无用的案例,因此标准中没有关于此的规则。例如,将其设为
const int() volatile可能会使它再次有用。也许吧。 -
没有禁止无用声明的规则。试图排除所有无用的结构对于语言设计来说是一个非常糟糕的策略。
-
@curiousguy 编译器对仅返回类型不同的函数抛出错误。这只是该场景的特例。所以应该出错
-
@code707 根据定义,函数不能仅在返回类型上有所不同,编译器会因为同一函数的两个不同声明而抱怨。
标签: c++ c++11 type-conversion constants language-lawyer