【问题标题】:Can't declare lambda with auto in VS 14 CTP : conditional expression of type 'void' is illegal无法在 VS 14 CTP 中使用 auto 声明 lambda:'void' 类型的条件表达式是非法的
【发布时间】:2014-07-26 00:09:06
【问题描述】:

使用 Visual Studio 2014 CTP、C++ (v140) 编译器:

auto gp = [&](BYTE* buff) {
     auto gp1 = [](char* bff, char** p1) {
                *p1 = strstr((char*)bff, "(");
                return (*p1);
     };
};

错误:

conditional expression of type 'void' is illegal

(也许auto 在那里输入错误?)

如果我将内部 lambda 声明为 std::function<char*(char*, char**)> gp1 那么它可以工作

是我做错了什么还是编译器错误?

【问题讨论】:

  • 内部编译器错误 (ICE)总是 是一个错误。您在第一个示例中缺少 };,但鉴于错误消息,我猜这是复制粘贴错误。遗憾的是,但这可能是 alpha 质量编译器所期望的。
  • 内部 lambda 有 2 个参数,所以你的 std::function 需要是 std::function<char*(char*, char**)>。此外,您应该能够使用一个简单的函数指针 - char*(*gp1)(char*, char**) = []...
  • @Praetorian 啊,是的,它有帮助但是......为什么auto 不起作用?
  • 谁知道......可能是我在第一条评论中所说的。 FWIW,如果将缺少的 }; 添加到您的原始示例中,代码将在 VS2013 上编译。
  • @Praetorian 我知道它在VS2013 中编译:) 我将添加}; 以使sn-p 更完整

标签: c++ visual-studio visual-c++ lambda


【解决方案1】:

我没有运行 2014,但您可能需要使用 '-> char*' 指定内部 lambda 的返回类型(可能默认为 void),如下所示:

auto gp = [&](BYTE* buff) {
    auto gp1 = [](char* bff, char** p1) -> char* {
        *p1 = strstr((char*)bff, "(");
        return (*p1);
    };
};

【讨论】:

  • 这个问题是 VS2014 特有的,在标准中我应该这样指定返回类型吗?为什么?
  • 您并不总是需要指定返回类型。这取决于编译器是否能够推断返回类型。我不确定为什么编译器无法在您的情况下推断出返回类型。仅供参考,这是标准的相关部分:open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf pg 109 (3.4) 这样做是否解决了您的问题?这总是有可能不是您的代码有什么问题。
  • 我修复了将其声明为 std::function 的问题,但是现在我想知道这是否是编译器错误。
  • @Heather 我不确定,但 Clang 版本 600.0.54 根本不会抱怨。查看标准,我看不出任何暗示您的代码有任何问题的地方。这可能是嵌套 lambda 的具体 VS2014 问题。如果您只是尝试自己编译内部 lambda,它会起作用吗?如果是这样,我会倾向于这是一个编译器问题。
  • inner lambda 工作,整个工作在 VC 2013 中有效,但在 VC 2015 中无效
猜你喜欢
  • 1970-01-01
  • 2017-05-27
  • 2016-07-18
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多