gpt4 book ai didi

c++ - 带有大括号初始化的 make_unique

转载 作者:可可西里 更新时间:2023-11-01 17:24:46 24 4
gpt4 key购买 nike

https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique写道 std::make_unique 可以实现为

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

这不适用于没有构造函数的普通结构。这些可以用大括号初始化,但没有非默认构造函数。示例:

#include <memory>
struct point { int x, z; };
int main() { std::make_unique<point>(1, 2); }

Compiling this将使编译器提示缺少 2 参数构造函数,这是正确的。

我想知道,是否有任何技术原因不根据大括号初始化来定义函数?如

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T{std::forward<Args>(args)...});
}

那个works well enough对于上面的场景。是否还有任何其他合法用例会被破坏?

看到一般趋势似乎更喜欢用大括号进行初始化,我认为在该模板中制作大括号是规范的选择,但标准不这样做的事实可能表明我遗漏了一些东西。

最佳答案

在 C++20 中,这将编译:

std::make_unique<point>(1, 2);

由于新规则allowing initializing aggregates from a parenthesized list of values .


在 C++17 中,你可以这样做:

std::unique_ptr<point>(new point{1, 2});

虽然这不适用于 make_shared。所以你也可以只创建一个工厂(作为练习向左转发):

template <typename... Args>
struct braced_init {
braced_init(Args... args) : args(args...) { }
std::tuple<Args...> args;

template <typename T>
operator T() const {
return std::apply([](Args... args){
return T{args...};
}, args);
}
};

std::make_unique<point>(braced_init(1, 2));

在 C++14 中,您必须实现 apply 并为 braced_init 编写一个工厂函数,因为还没有 CTAD - 但这些都是可行的。


Seeing how the general trend appears to prefer braces for initialization

需要引用。这是一个充满争议的话题——但我绝对不同意这种说法。

关于c++ - 带有大括号初始化的 make_unique,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55141594/

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