2016-04-05 12 views
0

強く型付けされた列挙型の基本的な型を確認するのにstd::is_sameを使用しようとしていましたが、二重括弧を使用する必要があるという奇妙な状況に気付きました。 。私は次のように下に例を低減しました:なぜstd :: is_sameで二重括弧が必要なのですか

#include <type_traits> 
#include <cassert> 
#include <stdint.h> 

int main(int argc, char *argv[]) 
{ 
    assert((std::is_same<unsigned int,uint32_t>::value == true)); // OK 
    assert((std::is_same<unsigned int,uint32_t>::value) == true); // OK 
    //assert(std::is_same<unsigned int,uint32_t>::value == true); // Compile error 
    static_assert(std::is_same<unsigned int,uint32_t>::value == true, "BAD"); // OK 
    return 0; 
} 

コンパイルエラー:

isSameAssert.cpp:9:62: error: macro "assert" passed 2 arguments, but takes just 1 
    assert(std::is_same<unsigned int,uint32_t>::value == true); // Compile error 
                  ^
isSameAssert.cpp: In function ‘int main(int, char**)’: 
isSameAssert.cpp:9:5: error: ‘assert’ was not declared in this scope 
    assert(std::is_same<unsigned int,uint32_t>::value == true); // Compile error 
    ^
make: *** [build/isSameAssert] Error 1 

誰もがこれを説明したりし参照に私を指すでしたか?

+2

これは、 'assert()'がマクロであるからです。 –

答えて

4

assertはマクロなので、表現assert(std::is_same<unsigned int,uint32_t>::value == true);ので、コンパイラはassertはパラメータを1つだけかかりますが、2が供給されたと文句を言いintuint32_tの間にカンマによる2つのパラメータでassertを呼び出しているようです。

実際、この問題を解決するために、括弧内に再度入力してください。

関連する問題