15

オブジェクト/変数などのタイプを照会するために decltype が使用されることは私の理解です。

次のようなウィキペディアにある例から:

int i;
decltype(i) x3; // type is int

私は次のようなことができると思いました:

class A
{
public:
    int a, b;
};

template<typename T>
struct IsClass
{
    enum { Yes = std::is_class<T>::value };
    enum { No = !Yes };
};

std::vector<A> v;
auto it = v.begin();
IsClass<decltype(it)::value_type>::Yes

結局、この行は合法だからです:

IsClass<std::vector<A>::iterator::value_type>::Yes

残念ながら、次のようにコンパイルされませんでした:error C2039: 'value_type' : is not a member of 'グローバル名前空間''`

decltype の存在下でこのように動作するようにスコープ解決が行われた理由についてのアイデアはありますか?

PS:違いがある場合は、MSVC2012 を使用しています ( Nov CTPなし)

4

1 に答える 1

10

これは、Visual C++ コンパイラの既知のバグです。Visual C++ 2013 Preview の時点ではまだ修正されていません。以下を使用して、この問題を回避できますstd::common_type

IsClass<std::common_type<decltype(it)>::type::value_type>::Yes
        ^^^^^^^^^^^^^^^^^            ^^^^^^^

(std::common_type単一のテンプレート引数を使用すると、その引数の型が生成されます。これはidentity、メタプログラミングで長い間使用されてきたテンプレートに相当する標準化された C++11 です。)

Microsoft Connect でパブリック バグ レポートを見つけることができます: Cannot use decltype before scope operator。この問題があなたにとって重要である場合は、そのバグ レポートに賛成票を投じることを検討してください。

于 2013-07-06T18:21:42.143 に答える