std::enable_if
メンバー関数を無効にするために使用しようとしている次のクラスに問題を絞り込みました。
#include <type_traits>
int foo(int& x) {
return x;
}
template<bool enable>
struct A {
int x;
template<bool dummy=true,
typename Enabler = typename std::enable_if<dummy && enable>::type>
auto disabled_method() const -> decltype(foo(x)) {
return foo(x);
}
};
int main() {
A<false> x;
}
!でdecltype(foo(x))
関数を無効にする必要がありますが、式に型エラーがありますenable_if
。
関数の戻り値の型で発生することに特に注意してください。たとえばdecltype(foo(x))
、を関数の本体に移動すると、SFINAEは正常に機能します。
template<bool dummy=true,
typename Enabler = typename std::enable_if<dummy && enable>::type>
auto disabled_method() const -> int {
decltype(foo((X)x)) local;
return foo(x);
}
(decltype(foo((X)x))
引数型として使用する場合も同様)
同様に、次のように宣言すると、SFINAEが正しく実行されます。
template<bool dummy=true,
typename X = const int,
typename Enabler = typename std::enable_if<dummy && enable>::type>
auto disabled_method() const -> decltype(foo((X)x)) {
return foo(x);
}
ただし、を使用decltype(foo((const int)x))
すると、Xがconst int
上記と等しいにもかかわらず、エラーが発生します。これは、テンプレートパラメータに追加のキャストを導入するとX
、置換が遅れることを示しているようです。
しかし、dummy
およびEnabler
上記テンプレートパターンアップは、とにかくそれを行うことになっていますか?
なんでこんなことが起こっているの?
これは「即時コンテキスト」とは何の関係もありません。
一般に、非依存構造のエラーにより、プログラムの形式が正しくないNDRになります(診断は不要)。[temp.res] / 8を参照してください。実装には、そのような問題を診断する(または診断しない)ための広い余地があります。
あなたの場合、foo(x)
テンプレートパラメータに依存せず、常に形式が正しくありません。したがって、実装は、A
インスタンス化されていない場合でも、自由に診断できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加