オプションの次のコードを考える:異なる結果はstdにキャスト:: <T>
#include <iostream>
#include <optional>
struct foo
{
explicit operator std::optional<int>() {
return std::optional<int>(1);
}
explicit operator int() {
return 0;
}
};
int main()
{
foo my_foo;
std::optional<int> my_opt(my_foo);
std::cout << "value: " << my_opt.value() << std::endl;
}
gcc 7.2.0 writesvalue: 1
。
MSVC2017(15.3)およびclang 4.0.0 however writevalue: 0
。
C++標準で正しいのはどれですか?
私はいつもオーバーロード解決が非テンプレートを優先していると考えました。なぜここで違うのですか? – Rakete1111
@ Rakete1111ここでは違いはありません。オーバーロードの解像度は、非テンプレートを「常に」優先するわけではありません。同等の変換シーケンス順位を有する2つの候補が与えられると、タイブレイカーのうちの1つは非テンプレートを好む。しかし、ここでは同等の変換順序のランキングはありません。 – Barry
@ Barry同じランクで2回のコンバージョンはありませんか? 1つは 'int'に、8つは' optional 'に、もう1つは(2)になりますか? –
Rakete1111