C++14 (および Clang は既にそれらをサポートしている) で変数テンプレートが登場し、標準is_same_v
および同様の型特性の提案があるため、次のように新しい型特性を作成できると便利だと思いました。
template<typename T>
constexpr bool is_const_and_volatile{std::is_const_v<T> && std::is_volatile_v<T>};
残念ながら、これにより、次の SSCCE と同等のエラーが発生します (これには、以下で説明するすべてが含まれています)。
#include <type_traits>
template<typename T>
constexpr bool is_pointer{std::is_pointer<T>::value};
template<typename T>
constexpr bool foo{is_pointer<T>};
int main() {
//foo<int *>;
}
この行をmain
コメント化すると、Clang は次のように出力します。
警告: 変数
is_pointer<type-parameter-0-0>
には内部リンケージがありますが、定義されていません
私には定義されているように見えます( inT
への変更は正常に機能することに注意してください)。インスタンス化する行のコメントを外すと、次のようになります(これも正常に動作します)。int *
foo
main
foo
T
int *
エラー: constexpr 変数
foo<int *>
は定数式で初期化する必要があります
ただし、次の古い構文に置き換えるfoo
と、両方のインスタンスが正常に機能します。
constexpr bool foo{std::is_pointer<T>::value};
変数テンプレートについて欠けているものはありますか? それらを使用して新しい変数テンプレートを作成する方法はありますか、それとも古い構文を使用して新しい変数テンプレートを作成し、他のコードに使用するときにのみ構文シュガーを楽しむ必要がありますか?