gpt4 book ai didi

c++ - 为什么我不能从 lambda 返回初始值设定项列表

转载 作者:IT老高 更新时间:2023-10-28 13:00:25 29 4
gpt4 key购买 nike

为什么此代码无效?

auto foo = [] () {
return {1, 2};
};

但是,这是有效的,因为 initializer_list 仅用于初始化 vector 而不是返回自身:

auto foo = [] () -> std::vector<int> {
return {1, 2};
};

为什么我不能返回 initializer_list?它可能很有用。例如,可用于初始化 vectorlist 或 ... 的 lambda 具有某些默认值。

最佳答案

Lambda 返回类型推导使用 auto规则,通常会推导出 std::initializer_list正好。但是,语言设计者禁止在 return 语句 ([dcl.spec.auto]/7) 中从花括号初始化列表中进行推导:

If the deduction is for a return statement and the initializer is a braced-init-list ([dcl.init.list]), the program is ill-formed.

原因是std::initializer_list具有引用语义([dcl.init.list]/6)。
[]() -> std::initializer_list<int> { return {1, 2}; }
[]() -> const int & { return 1; } 一样糟糕. initializer_list 的后备数组的生命周期当 lambda 返回时,对象会结束,并且会留下一个(或两个)悬空指针。

Demo :

#include <vector>

struct Noisy {
Noisy() { __builtin_printf("%s\n", __PRETTY_FUNCTION__); }
Noisy(const Noisy&) { __builtin_printf("%s\n", __PRETTY_FUNCTION__); }
~Noisy() { __builtin_printf("%s\n", __PRETTY_FUNCTION__); }
};

int main()
{
auto foo = []() -> std::initializer_list<Noisy> { return {Noisy{}, Noisy{}}; };
std::vector<Noisy> bar{foo()};
}

输出:

Noisy::Noisy()
Noisy::Noisy()
Noisy::~Noisy()
Noisy::~Noisy()
Noisy::Noisy(const Noisy&)
Noisy::Noisy(const Noisy&)
Noisy::~Noisy()
Noisy::~Noisy()

注意在所有 Noisy 之后如何调用复制构造函数到目前为止创建的对象已经被销毁了。

关于c++ - 为什么我不能从 lambda 返回初始值设定项列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35361408/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com