clang接受“static_cast <const int&=”“>”使用“显式运算符int()const”,gcc / VS拒绝

时间:2017-11-07 00:00:02

标签: c++11 gcc clang visual-studio-2017 static-cast

鉴于此c ++ 11代码:(一切都与c ++ 14或c ++ 17编译相同)

class typeSafe {
public:
   typeSafe(int tValue)
      : value(tValue) {
   }

   explicit operator int() const {
      return value;
   }
private:
   int value;
};

int main() {
   typeSafe x{5};
   typeSafe y{5};
   if(static_cast<const int&>(x) == static_cast<const int&>(y)) {

   }
}

争议是因为static_cast尝试转换为const int&,但显式运算符会提供int,而不是int&

clang 5.0.0默默地编译它,并打开每个警告。

gcc拒绝它,用:

typeSafe.cpp: In function ‘int main()’:
typeSafe.cpp:17:32: error: invalid static_cast from type ‘typeSafe’ to type ‘const int&’
    if(static_cast<const int&>(x) == static_cast<const int&>(y)) {
                                ^

typeSafe.cpp:17:62: error: invalid static_cast from type ‘typeSafe’ to type ‘const int&’
    if(static_cast<const int&>(x) == static_cast<const int&>(y)) {
                                                              ^

Visual Studio 2017 15.5预览2拒绝它,使用:

typeSafe.cpp(17): error C2440: 'static_cast': cannot convert from 'typeSafe' to 'const int &'
  typeSafe.cpp(17): note: Reason: cannot convert from 'typeSafe' to 'const int'
  typeSafe.cpp(17): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

请注意,如果static_cast尝试转换为int&,则所有3个编译器都拒绝它,并且clang说:

typeSafe.cpp:17:7: error: non-const lvalue reference to type 'int' cannot
      bind to a value of unrelated type 'typeSafe'
   if(static_cast<int&>(x) == static_cast<int&>(y)) {
      ^                 ~
typeSafe.cpp:17:31: error: non-const lvalue reference to type 'int' cannot
      bind to a value of unrelated type 'typeSafe'
   if(static_cast<int&>(x) == static_cast<int&>(y)) {
                              ^                 ~

那么,谁是对的,谁是错的?

0 个答案:

没有答案