gpt4 book ai didi

c++ - 为什么C++使std::initializer_list的元素类型为const?

转载 作者:行者123 更新时间:2023-12-03 07:23:28 30 4
gpt4 key购买 nike

我通常使用std::initializer_list<std::string>(即{"foo"s, "bar"s})填充容器。

显然,std::initializer_list<std::string>包含临时字符串,我可以将它们移动到容器中:

#include <string>
#include <list>

using namespace std::literals;

void f(std::initializer_list<std::string> il)
{
std::list<std::string> coll;
for (auto&& tmp_str : il)
{
coll.emplace_back(std::move(tmp_str)); // Why ok here?
}
}

int main()
{
f({"foo"s, "bar"s});
}

但是,根据 cppref:

An object of type std::initializer_list is a lightweight proxy object that provides access to an array of objects of type const T.



为什么C++使std::initializer_list的元素类型为const?

最佳答案

Obviously, std::initializer_list<std::string> contains temporary strings



可以吗?允许将其实现为瘦代理。在这种情况下,它将引用原始实例 "foo"s"bar"s

... and I can move them into a container



我不信。 std::move()左值引用的 const产生... const右值引用。这与移动构造器作为可行的候选人不太匹配。
#include <iostream>

struct A {
A() { std::cout << "A()\n"; }
A(A&&) { std::cout << "A(&&)\n"; }
A(A const&) { std::cout << "A(const&)\n"; }
};

int main() {
const A a;
A b(std::move(a));
}

版画

A()
A(const&)

MSVC 2019甚至警告:

Warning C26478  Don't use std::move on constant variables. (es.56).

另请参阅 Why can we use std::move on a const object?

关于c++ - 为什么C++使std::initializer_list的元素类型为const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61077079/

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