相关疑难解决方法(0)

Lambda的显式返回类型

当我尝试编译此代码(VS2010)时,我收到以下错误: error C3499: a lambda that has been specified to have a void return type cannot return a value

void DataFile::removeComments()
{
  string::const_iterator start, end;
  boost::regex expression("^\\s?#");
  boost::match_results<std::string::const_iterator> what;
  boost::match_flag_type flags = boost::match_default;
  // Look for lines that either start with a hash (#)
  // or have nothing but white-space preceeding the hash symbol
  remove_if(rawLines.begin(), rawLines.end(), [&expression, &start, &end, &what, &flags](const string& line)
  {
    start = line.begin();
    end = line.end();
    bool temp = boost::regex_search(start, end, what, expression, flags);
    return temp; …
Run Code Online (Sandbox Code Playgroud)

c++ lambda visual-c++ c++11 visual-c++-2012

74
推荐指数
3
解决办法
9万
查看次数

lambda捕获的std :: cout的本地引用,而不需要它

我迷失了吗?这总是允许的吗?

#include <iostream>

int main()
{
    auto& os = std::cout;

    auto write = []()
    {
        os << "what\n";
    };

    write();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用:

Apple LLVM 10.0.0版(clang-1000.10.44.4)
目标:x86_64-apple-darwin17.7.0

虽然也看到Coliru:

(现场演示)

我一直认为空捕获不会捕获任何东西.

的确,MSDN :

空捕获子句[]表示lambda表达式的主体不会访问封闭范围中的变量.

进一步的研究表明,这实际上可以捕捉const东西(我也不知道,但无论如何),但os不是const(没有参考!虽然它不可改变的......).

当我打开-Wextra并注意到Clang认为&os捕获(存在于我的真实代码中)是不必要的时候,我偶然发现了这一点.删除它我错开了发现构建工作.

c++ lambda language-lawyer c++17

33
推荐指数
1
解决办法
689
查看次数

我的书对lambda返回类型的讨论是错误的吗?

我的书说:

具有函数体的Lambda包含除了单个return语句之外的任何未指定返回类型的返回void.

但是这个:

auto f = []{
  int i=0; i++;
  return std::string("foo");
};
std::cout << f() << std::endl;
Run Code Online (Sandbox Code Playgroud)

实际上编译并打印出"foo",但是lambda expr不仅仅包含一个return语句,因此它应该返回void,因为它不会手动指定" - > std :: string"作为返回类型.

这里发生了什么?

我在基于Clang 3.2的最新Xcode 4.6中使用Apple的编译器似乎:

clang --version

Apple LLVM版本4.2(clang-425.0.24)(基于LLVM 3.2svn)目标:x86_64-apple-darwin12.2.0线程模型:posix

c++ lambda llvm clang c++11

13
推荐指数
1
解决办法
557
查看次数

什么时候可以省略C++ 11 lambda中的返回类型?

据我所知,在标准C++ 11(不是C++ 14)中,当省略lambda的返回类型时,其返回类型推断为:

  1. 返回表达式的类型,只要lambda只包含带有表达式的单个return语句,或者
  2. void 在所有其他情况下.

现在考虑这段代码:

#include <iostream>

auto closure = [](int x)
{
    x++;
    return x;
};

int main()
{
    int y = closure(10);
    std::cout << y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这应该属于案例2.但是代码编译好像是带有auto类型推导的C++ 14 ,在g ++ 4.9.2,g ++ 5和clang ++中都有-pedantic -Wall -Wextra -std=c++11.这里发生了什么?我是否解释了标准错误?

c++ lambda c++11 type-deduction

13
推荐指数
2
解决办法
1290
查看次数

为什么std :: function可以用一个具有不同返回类型的lambda构造?

以下编译正常:

#include <functional>

int main()
{
    std::function<const int&()> f = []() -> int {return 1;};
    const int& r = f(); // r is a dangling reference
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么可以将返回类型设置为std::function具有const int&返回类型的lambda int?恕我直言,允许这种演员隐含地发生并且没有任何警告.

c++ lambda std-function

10
推荐指数
1
解决办法
512
查看次数

Lambda没有自动推断出返回类型

当我在/sf/answers/2248084891/上回答我自己的问题时,我又有了疑问.

const CArray<CItem*>& Items=
    (ItemsInput!= nullptr)?
        *ItemsInput
    :
        [this]() -> const CArray<CItem*>&
        {
            CArray<CItem*> InnerItems;
            GetContainer().GetInnerItems(InnerItems, NULL, true);
            return (InnerItems);
        } ()
;
Run Code Online (Sandbox Code Playgroud)

我试图删除-> const CArray<CItem*>&返回部分,但在编译时它给出了两个错误:

1>FunctionClass.cpp(line of last semicolon): error C2440: 'initializing' : cannot convert from 'void' to 'const CArray<TYPE> &'
1>          with
1>          [
1>              TYPE=CItem *
1>          ]
1>          Expressions of type void cannot be converted to other types


1>FunctionClass.cpp(line of the return statement): error C3499: a lambda that has been specified …
Run Code Online (Sandbox Code Playgroud)

c++ lambda return-type type-deduction

3
推荐指数
1
解决办法
350
查看次数