gpt4 book ai didi

c++ - 转发参数时应该使用 () 还是 {}?

转载 作者:IT老高 更新时间:2023-10-28 22:41:27 26 4
gpt4 key购买 nike

我有以下类(class):

struct foo
{
std::size_t _size;
int* data;
public:
explicit foo(std::size_t s) : _size(s) { }
foo(std::size_t s, int v)
: _size(s)
{
data = new int[_size];
std::fill(&data[0], &data[0] + _size, v);
}

foo(std::initializer_list<int> d)
: _size(d.size())
{
data = new int[_size];
std::copy(d.begin(), d.end(), &data[0]);
}

~foo() { delete[] data; }

std::size_t size() const { return _size; }
};

我想像这样向它转发参数:

template <typename... Args>
auto forward_args(Args&&... args)
{
return foo{std::forward<Args>(args)...}.size();
//--------^---------------------------^
}

std::cout << forward_args(1, 2) << " " << forward_args(1) << " "
<< forward_args(2) << "\n";

如果我用 () 替换 {} 输出是 1 1 2 而不是 2 1 1 .

哪个对我的类(class)最有意义?

最佳答案

在这种情况下,由于类有一个构造函数,它采用 std::initializer_list,在工厂函数中使用 {} 经常会改变任何您传入的参数列表 - 通过将任何超过 2 个的参数包转换为 initializer_list。

这会让函数的用户感到惊讶。

因此,使用 () 形式。想要传递 initializer_list 的用户可以通过调用来明确地传递

forward_args({ ... });

注意,要使上述语法正常工作,您需要提供另一个重载:

template <class T>
auto forward_args(std::initializer_list<T> li)
{
return foo(li).size();
}

关于c++ - 转发参数时应该使用 () 还是 {}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37158899/

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