8

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 *foomainfooTint *

エラー: constexpr 変数foo<int *>は定数式で初期化する必要があります

ただし、次の古い構文に置き換えるfooと、両方のインスタンスが正常に機能します。

constexpr bool foo{std::is_pointer<T>::value};

変数テンプレートについて欠けているものはありますか? それらを使用して新しい変数テンプレートを作成する方法はありますか、それとも古い構文を使用して新しい変数テンプレートを作成し、他のコードに使用するときにのみ構文シュガーを楽しむ必要がありますか?

4

2 に答える 2

3

あなたのコードは有効で、clang SVN によって受け入れられます。リンク エラーは、数日前に修正したclang バグ 17846が原因でした。

于 2014-02-05T20:28:03.393 に答える