为什么我只为bool和int而不是加倍得到-Wunused-lambda-capture?

时间:2018-10-11 11:06:04

标签: c++ lambda c++17

我实际上是在Visual Studio 2017(Visual C ++ 14.15.26706)上使用C ++ 17中的lambda做一些测试。下面的代码可以正常工作。

#include <iostream>

int main()
{
    bool const a_boolean { true };
    int const an_integer { 42 };
    double const a_real { 3.1415 };

    auto lambda = [a_boolean, an_integer, a_real]() -> void
    {
        std::cout << "Boolean is " << std::boolalpha << a_boolean << "." << std::endl;
        std::cout << "Integer is " << an_integer << "." << std::endl;
        std::cout << "Real is " << a_real << "." << std::endl;
    };

    lambda();
    return 0;
}

但是我的一个朋友使用现代MinGW在Qt Creator上进行了测试,我也这样做了,而且对于相同的代码,我们两个人都收到了两个警告,这非常宝贵。

warning: lambda capture 'a_boolean' is not required to be capture for this use. [-Wunused-lambda-capture]
warning: lambda capture 'an_integer' is not required to be capture for this use. [-Wunused-lambda-capture]

如果我从捕获区域中删除了a_booleanan_integer,该代码仍然可以使用MinGW进行编译,甚至可以像Wandbox(GCC 9.0)那样使用-pedantic和C ++ 17,但在Visual Studio 2017中不再可用。

C3493 'a_boolean' cannot be implicitly captured because no default capture mode has been specified.
C3493 'an_integer' cannot be implicitly captured because no default capture mode has been specified.
C2064 term does not evaluate to a function taking 0 arguments.

如果我从constan_integer的声明中删除a_boolean,则在所有平台上我都需要捕获它们,否则,它们中的任何一个都不会编译。

如果我删除a_real,则MinGW和GCC都不高兴,也不想编译,甚至抱怨error: 'a_real' is not captured,即使它是const

  • 哪个编译器正确? MinGW / GCC还是Visual Studio?
  • 为什么GCC允许对布尔值和整数进行隐式捕获,但是为什么不允许对浮点值进行隐式捕获?
  • 哪些规则或解释可以帮助我更好地了解正在发生的事情?

谢谢大家,祝大家有美好的一天。

0 个答案:

没有答案