什么时候的static_cast为int删除布尔操作错误

问题描述 投票:3回答:1

当进行static_cast<int>,我收到一个关于删除布尔()运算符投诉:

main.cpp:15:35: error: use of deleted function 'J::operator bool()'
     j = static_cast<int>(*this) + 1;
                               ^

可能是一些明显我缺少在这里,但我不明白为什么它会尝试运行的布尔转换:

#include <iostream>

struct J {
    int j;
    J (int j) : j (j) {}

    operator bool() = delete;

    explicit operator int() const {
        if (j > 304) { std::cout << "Out of range\n"; }
        return j;
    }

    J& operator++ () {
        j = static_cast<int>(*this) + 1;
        return *this;
    }
};

int main() {
    J b {1020};
    ++b;
}
c++ boolean static-cast
1个回答
1
投票

总之,改变布尔操作符重载到两者之一:

explicit operator bool() = delete; // Prevent implicit conversion (int to bool)
operator bool() const = delete;    // Non-const had higher priority for resolution

这是两件事情。隐式整型转换和功能解析顺序。


看起来这是典型的基本上都是C ++函数的分辨率。让我们来回顾一下:

class A {
public:
  void foo() { cout << "non-const" << endl; }
  void foo() const { cout << "const" << endl; }
};

int main() {
  A a1;
  a1.foo(); // prints "non-const"
  const A a2;
  a2.foo(); // prints "const"
  return 0;
}

如果非const一个是可用的,它具有比常量一个更高的优先级。

回到你的榜样,让我们​​把事情说清楚,改变布尔类型转换操作符非const int的演员。

explicit operator int() = delete; // Instead of "operator bool() = delete;"

有了这个,仍然失败出于同样的原因上面。由于operator++是非常量如此this的非const所以static_cast<int>(*this)决心非const operator int。但是它被删除,因此编译器会抱怨。因此,如果我们没有这个非const一个删除时,它会得到解决const版本和正常工作。

所以,现在怎么样operator bool() = delete;?此功能不explicit声明所以int将隐式尝试转换到bool。因此,越来越为一个常量与之前被删除的一个解决。

© www.soinside.com 2019 - 2024. All rights reserved.