为什么我不能从decltype返回的value_type获取bool值?

时间:2016-05-05 19:45:18

标签: c++ conditional metaprogramming value-type decltype

这似乎是问题。此代码runs fine in gcc但无法在Visual Studio中编译:

#include <iostream>
#include <type_traits>
#include <typeinfo>

using namespace std;

true_type foo();

template <typename T>
struct bar{
    using def = conditional_t<decltype(foo())::value, char, void>;
};

int main() {
     cout << typeid(bar<int>::def).name() << endl;

     cout << decltype(foo())::value << endl;
}

给出的错误是:

  

错误C2146:语法错误:在标识符>

之前缺少value

Live Example

是否有针对此问题或解决方法的错误修复?

2 个答案:

答案 0 :(得分:2)

在您的问题中,您使用的是decltype(foo())

using def = conditional_t<decltype(foo())::value, char, void>;
                                   ^^^^^

在Ideone上,decltype(foo)

using def = conditional_t<decltype(foo)::value, char, void>;
                                  ^^^^^

他们是不同的东西。在第一种情况下,您将获得调用foo 的结果类型。在第二个中,您将获得函数本身的类型

好的,从那时起事情发生了巨大变化。

代码经过编辑,应该编译得很好,但是与Visual Studio的编辑失败了,而clang对这段代码非常满意,并没有显示任何错误甚至是警告。

所以,鉴于clang(最新版本,使用--std=c++14 -Wall -Wextra)发现此代码正确,我相信这应该是 VS 中的错误。

答案 1 :(得分:1)

我不确定它是否可以帮到你,但我能解决这个问题:

首先定义:

template <typename I> using id = I;

然后用

替换decltype(foo())::value的每个实例
id<decltype(foo())>::value

或者,您可以以相同的方式使用std::common_type_t

std::common_type_t<foo()>::value

或者,我的心灵能力预测你可能只想为decltype<foo()>定义一个单独的类型,以方便:

using id = decltype(foo());

然后将decltype(foo())::value的所有实例替换为id::value