gpt4 book ai didi

c++ - std::vector 的非静态数据成员初始值设定项/调用构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:55 25 4
gpt4 key购买 nike

代码:

class A {
std::vector<int> x = {2,3}; // x[0] = 2 and x[1] = 3
std::vector<int> y = std::vector<int>(2,3); // x[0] = 3 and x[1] = 3 Too verbose!!
};

有没有一种方法可以调用 std::vector<int> 的构造函数?仅使用大括号初始值设定项,或至少使用具有相同效果的较短版本?

我不想重复std::vector<int> .

最佳答案

有什么技巧可以使用吗?

如果您的唯一目标是不必“明确地”指定类型两次,您可以使用 decltype为您的任务提供一些帮助:

class Obj {
std::vector<int> v1 = decltype(v1) (2,3);
};

还要记住 typedef/using是一种无需输入太多1的好方法:

struct Obj {
using VInt = std::vector<int>;
// typedef std::vector<int> VInt;

VInt v = VInt (3,2);
};

1. 双关语无意


标准对此有何规定?

可悲的是,标准规定了以下关于在您的类(class)主体内初始化成员的内容:

9.2/5 Class members [class.mem]

A member can be initialized using a brace-or-equal-initializer. (For static data members, see 9.4.2; for non-static data members, see 12.6.2).

我们已经找到了一些关于在初始化成员时可以做什么和不可以做什么的提示,但要 100% 确定我们应该继续阅读brace-or-equal-initializer 确实如此。

8.5/1 Initializers [dcl.init]

...brace-or-equal-initializer: = initializer-clause braced-init-listinitializer-clause: assignment-expression braced-init-listinitializer-list: initializer-clause ...opt initializer-list , initializer-clause ...optbraced-init-list: { initializer-list ,opt } { }

With the above specification of braced-or-equal-initializer we found that we are faced with two options when initializing members within the body of our class, using either a = together with an initializer-clause, or a braced-init-list on it's own.

The above boils down to either of these two:

struct Obj {
Type foo = Type (1,2,3); /* example of an initializer-clause */
Type bar {1,2,3}; /* example of a braced-init-list */
};

braced-init-list 看起来很棒,让我们使用它吧!

std::vector<...>接受 std::initializer_list在它的构造函数的一个重载中,我们不能使用 braced-init-list 来调用带有两个参数的构造函数 (size_type count, const T& value) ,因为它将被用作我们的 vector 的内容。

因此,我们坚持使用initializer-clause

请参阅之前的hack 以获得确认但可能不那么明显的解决方案。

关于c++ - std::vector 的非静态数据成员初始值设定项/调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11438341/

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