gpt4 book ai didi

c++ - 了解 C++ 转换运算符的选择

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

我有一个类似可选的类(我不能使用可选的,因为它在 C++17 中)。它包含一个(可能的)值以及一个指示它是否有效的标志。我有一个明确的 bool 运算符和一个转换运算符来获取值。问题是,有时 C++ 会在明确的 bool 上下文(if 语句)中选择 bool 运算符,而其他时候则不会。谁能帮助我理解这种行为:

#include <algorithm>
#include <stdexcept>

template <typename T>
struct maybe {
maybe() : valid_(false) {}
maybe(T value) : valid_(true) { new (&value_) T(value); }

operator T&&() {
return std::move(value());
}

explicit operator bool() const {
return valid_;
}

T& value() {
if (!valid_) {
throw std::runtime_error("boom");
}
return value_;
}

private:
union {
T value_;
};
bool valid_;
};


int main() {
// fine, uses operator bool()
maybe<std::pair<int,int>> m0;
if (m0) {
std::pair<int,int> p = m0;
(void)p;
}

// throws error, uses operator T&&()
maybe<double> m1;
if (m1) {
double p = m1;
(void)p;
}
}

最佳答案

每当你写:

if (x)

这相当于写了:

bool __flag(x);
if (__flag)

这称为 bool 的上下文转换(请注意,它是直接初始化,因此 explicit 转换函数是一个候选)。

当我们对 m0 的构造进行重载决策时,只有一个有效候选者:explicit operator bool() const

但是当我们对 m1 的构造进行重载解析时,有两个:explicit operator bool() constoperator double&&(),因为 double 可以转换为 bool。后者是更好的匹配,因为对 bool 转换函数有额外的 const 限定,即使我们必须进行额外的 double 转换。因此,它赢了。

只需从您的界面中删除 operator T&&(),因为它对这种类型没有多大意义。

关于c++ - 了解 C++ 转换运算符的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51637791/

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