私はstd::optional
実装では、このコードで出くわした:このsizeof式はどのように評価されますか?それはなぜそのように呼ばれていますか?
template <class T, class U>
struct is_assignable
{
template <class X, class Y>
constexpr static bool has_assign(...) { return false; }
template <class X, class Y, size_t S = sizeof((std::declval<X>() = std::declval<Y>(), true)) >
// the comma operator is necessary for the cases where operator= returns void
constexpr static bool has_assign(bool) { return true; }
constexpr static bool value = has_assign<T, U>(true);
};
私はそれがどのように動作するかまたはそれを評価する方法を理解カント一部がsize_t S = sizeof((std::declval<X>() = std::declval<Y>(), true))
である私は割り当て操作が失敗した場合、それがバックに落ちることを知っていますfalseを返すhas_assignの最初の定義ですが、なぜ, true)
という部分があるのかわかりません。
私は代入演算子でvoidを返し、sizeof
の, true
部分を削除しても、同じ結果が得られます。
http://en.cppreference.com/w/cpp/language/sfinae。与えられた 'X'と' Y'に対して 'sizeof'の式が有効であれば、' has_assign'の2つのオーバーロードがあり、もう一つは 'has_assign(true)'の方が良い一致として選択されます。式が無意味な場合、その過負荷は破棄され、最初のものが選択されます。 –
一部のコンパイラでは、 'sizeof(void)== 1'を拡張子として定義しています。より多くの警告を有効にします。 – Quentin
'class S = decltype(std :: declat()= std :: decl ())'と書く方がより直接的でしょうか。とにかく 'S 'が何であっても、その式が有効であることは気にしません。 –
Barry