gpt4 book ai didi

c++ - std::initializer_list 不能从 std::initializer_list 构造

转载 作者:太空狗 更新时间:2023-10-29 20:53:46 25 4
gpt4 key购买 nike

我的问题是关于 std::initializer_list 之间缺乏转换当这些转换看起来很容易实现时,包含的类型或多或少是 cv 限定的类型。

考虑以下无效代码:

std::initializer_list<int> x{1,2,3,4,5,6};
std::initializer_list<int const> y = x; // error! cannot convert!

现在考虑 std::optional并忽略荒谬的类型:

std::optional<std::vector<int>> x{std::in_place, {1,2,3,4,5}}; // OK
std::optional<std::vector<int const>> y{std::in_place, {1,2,3,4,5}}; // error!

假设语言规范要求推导非 cv 合格 U用于 std::initializer_list<U>默认情况下。

据我所知,std::optional 的全部内容(和 std::anystd::variant )具有 std::initializer_list构造函数重载是为了避免指定初始化列表的确切类型。要编译上述代码的第二行,这正是您必须做的。

std::initializer_list已经持有 const*它的数据(在 libc++ 中)。我没有理由看到上面的代码不起作用?这是语言中可以解决的问题,还是我遗漏了什么?

最佳答案

听起来你的问题是为什么 std::initializer_list<T const>不能从 std::initializer_list<T> 构造尽管实现这样的转换很容易。

我认为答案是你不应该拥有 std::initializer_list<T const>首先,正如您所指出的那样,std::initializer_list<T>只给出 const无论如何都可以访问它的元素。

因此可以说在 C++ 中存在一种“文化规范”,即您不应该拥有任何需要 std::initializer_list<T const> 的构造函数。争论。例如,标准库容器都不这样做,因为 cv 限定值类型无论如何都是非法的(除了 std::array 的情况,当然,它无论如何都没有用户定义的构造函数)。

如果你自己写类型MyContainer支持 MyContainer<T const> , 那么我建议你让它看起来像下面这样:

template <class T>
class MyContainer {
public:
MyContainer(std::initializer_list<std::remove_cv_t<T>> il);
// ...
};

关于c++ - std::initializer_list<int const> 不能从 std::initializer_list<int> 构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41560567/

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