次のコードを検討してください。
#include <iostream>
class first
{
public:
constexpr first(bool val) noexcept : _value{val} {}
constexpr operator bool() const noexcept {return _value;}
private:
bool _value;
};
class second
{
public:
constexpr second(first val) noexcept : _value{val} {}
constexpr operator first() const noexcept {return _value;}
private:
first _value;
};
int main(int argc, char** argv)
{
first f{false};
second s{true};
bool b1 = f;
bool b2 = s; // Not compiling
return 0;
}
最近まで、標準とコンパイラは、必要な変換シーケンスが存在する場合にそれを見つけるのに十分「賢い」と考えていました。
つまり、 が に変換され、次に にbool b2 = s
変換s
されると考えていました。しかし、明らかにそれは起こっていません。first
bool
と の同等の動作を取得するための正しいアプローチは何first
ですかsecond
?