gpt4 book ai didi

c++ - 将 static_cast 转换为 int 时有关删除 bool 运算符的错误

转载 作者:太空狗 更新时间:2023-10-29 22:54:39 24 4
gpt4 key购买 nike

在执行 static_cast<int> 时,我收到关于删除的 bool() 运算符的投诉:

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

可能我在这里遗漏了一些明显的东西,但我不明白为什么它会尝试运行 bool 转换:

#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;
}

最佳答案

简而言之,将 bool 运算符重载更改为以下之一:

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。

回到您的示例,让我们把事情弄清楚,将 bool cast 运算符更改为 non-const int cast。

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

有了这个,由于与上述相同的原因,它仍然失败。作为operator++是非常量所以 this是非常量所以 static_cast<int>(*this)解析为非常量 operator int .但是它被删除了,所以编译器会提示。因此,如果我们没有删除这个非 const 版本,它就会用 const 版本解析并正常工作。

那么现在 operator bool() = delete; 呢? ?此函数未使用 explicit 声明所以int将隐式尝试转换为 bool .所以它在到达 const 之前用 deleted 解决。

关于c++ - 将 static_cast 转换为 int 时有关删除 bool 运算符的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54602653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com