【问题标题】:error C3499: a lambda that has been specified to have a void return type cannot return a value错误 C3499:已指定为具有 void 返回类型的 lambda 无法返回值
【发布时间】:2015-04-26 10:06:40
【问题描述】:

我正在使用以下 lambda,但出现此错误。我不明白为什么编译器不喜欢我正在做的事情。

std::string captchaWord(6, 0);
std::generate(captchaWord.begin(), captchaWord.end(), []() {
    unsigned int num = Randomizer('z' - 'a' + 1 + '9' - '0' + 1);
    char ch = num + 'a';
    if (num >= 'z' - 'a' + 1)
    {
        ch += '0' - 'z' - 1;
    }
    return ch;
});

顺便说一下,R​​andomizer 是一个具有以下签名的函数:

unsigned int Randomizer(unsigned int);

这是我收到的错误消息:

错误 C3499:已指定为具有 void 返回类型的 lambda 无法返回值。

【问题讨论】:

  • 消息lambda that has been specified to have a void return type 很清楚。您必须指定返回类型。例如。 []() -> int ...
  • 您的代码是正确的,并且可以使用g++ 和 VC12 正常编译。请指定您使用的是哪个编译器。
  • 你用的是什么编译器?视觉工作室?对我来说,代码编译得很好。 (另见cpp.sh/4hbi
  • @BetaCarotin 你确实是正确的。我知道这一点,并且使用您的建议确实有效。我试图弄清楚为什么我不得不在这个 lambda 函数中指定如此明显的返回值。
  • @Abhijit 我正在使用 vc 2013

标签: c++ lambda unsatisfiedlinkerror


【解决方案1】:

你必须指定返回类型:

[]() -> char {
// your code;
}

仅当整个 lambda 包含 仅包含单个 return 语句(在 C++11 中)时,自动推导才有效,否则,您需要指定类型。另请参阅lambda on cppreference 上的文档。在 C++14 中,规则允许返回之前的其他语句。

【讨论】:

  • 你的意思是 "single statement" 而不是 "single return statement"
  • 不,我的意思是单个 return 语句,与open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#975 中使用的语言相同-“只有当 lambda 的主体由单个 return 语句组成时,才能推断出 lambda 的返回类型”
【解决方案2】:

根据当前标准 C++14,您的代码是有效的。但在 C++11 中,没有指定返回类型的 lambda 的返回类型为 void,除非其主体由单个 return 语句组成。

您的编译器似乎不支持最新标准。要解决此问题,请指定返回类型:

[]()->char { .... }

【讨论】:

  • 但在 C++11 之前,标准不支持 lambda。
  • @Abhijit 谢谢,我的意思是在 C++14 之前。固定。
  • 是的,但在 C++11 中的定义是:“如果主体仅由带有表达式的单个 return 语句组成”——即没有其他语句!
  • @Anteru 我认为您指的是已删除的评论。
  • 是的,好像他把它删了.. 记录一下,原来的评论是 lambda 只包含一个返回值,这对于 C++11 的自动类型推断是不够的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多