【问题标题】:Why Can't I Get the bool Value from a value_type Returned by decltype?为什么我不能从 decltype 返回的 value_type 中获取 bool 值?
【发布时间】:2016-05-05 19:45:17
【问题描述】:

这似乎是 问题。此代码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 之前缺少 &gt;

Live Example

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

【问题讨论】:

  • 你使用什么编译器? (似乎在gcc 6.1 上工作)
  • @milleniumbug 不幸的是我在 Visual Studio 上似乎有一个错误:(
  • 以下是一些关于直接将作用域运算符与 decltype 一起使用的老问题:decltype and the scope operator in C++Why does scope resolution fail in presence of decltype?。好像现在有效,但是微软还不支持。
  • @ChristopherOicles 是的,我将其报告为错误。似乎它实际上正在使struct 触发它的template,不幸的是我需要模板。
  • 我不确定它是否能帮助你,但我可以像这样解决这个问题:首先定义:template &lt;typename I&gt; using id = I; 然后用id&lt;decltype(foo())&gt;::value 替换decltype(foo())::value 的每个实例。奇怪的是cout这行好像可以编译,但是using def = ...却触发了错误。

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


【解决方案1】:

在您的问题中,您使用的是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 中的一个错误

【讨论】:

  • @JonathanMee,这使用 C++14 标准编译得很好。虽然我不知道我们如何改变 VS 中的标准...
  • 您尝试过我在 Visual Studio 2015 上发布的代码吗?我发布了一个指向 Microsoft 的 Web 编译器的链接。它确实没有编译好。
  • @JonathanMee,是的,我在那里试过,但没有编译。然后我用clang --std=c++11 编译它,它抱怨找不到conditional_t,所以我用--std=c++14 编译它,它运行良好,没有任何警告。所以我认为可以在VS中指定语言标准,但是在网上没有找到任何有用的东西。我认为这是VS中的一个错误。您可能想尝试 MinGW 或 MinGW64,我发现后者非常好,而 MinGW 可能有点过时了。
  • 也许您可以将其添加到您的答案中,因为到目前为止它指出了我确实有但实际上不是我的问题的印刷错误。
【解决方案2】:

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

先定义:

template <typename I> using id = I;

然后将decltype(foo())::value的每个实例替换为

id<decltype(foo())>::value

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

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

或者,我的精神力量预测您可能只想为decltype&lt;foo()&gt; 定义一个单独的类型,为方便起见:

using id = decltype(foo());

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

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2016-05-06
    相关资源
    最近更新 更多