繁体   English   中英

对成员对象的非默认显式构造函数的内联使用

[英]Inline use of non-default explicit constructor for a member object

在C ++ 11(或以后的版本)中,以下合法的代码有一些简单的变化吗?

class A
   {
public:
   std::vector<char> b(123); // declare a vector with 123 elements
   };

我能找到的最接近的东西有点笨拙,可能效率低下...

class A
   {
public:
   std::vector<char> b = std::vector<char>(123);
   };

我试图避免使用初始化列表。 我更喜欢将b的声明和初始化整合到一行代码中。 向量将始终是相同的大小。

在此示例中,我使用的是std::vector ,但是答案可能会更普遍。


为了达到良好的效果,这是gcc 4.8版的错误消息:

错误:数值常量std :: vector b(123)之前的预期标识符;

这是clang 3.7版的消息:

错误:预期参数声明程序std :: vector b(123);

不大可能。 首先允许NSDMI的原始建议解决了此问题:

N2756

在Kona中提出的有关标识符范围的问题:

在核心工作组在2007年9月于科纳举行的会议上进行讨论时,引发了一个关于初始化程序中标识符范围的问题。 我们是否要允许类范围具有正向查找的可能性? 还是我们需要在解析初始点时就对其进行定义?

需要什么:

类范围查找的动机是,我们希望能够将任何内容放入非静态数据成员的初始化程序中,而我们可以将其放入mem初始化程序中,而无需显着改变语义(模直接初始化与复制初始化) :

 int x(); struct S { int i; S() : i(x()) {} // currently well-formed, uses S::x() // ... static int x(); }; struct T { int i = x(); // should use T::x(), ::x() would be a surprise // ... static int x(); }; 

问题一:

不幸的是,这使得在解析声明时“ expression-list ”形式的初始化程序变得模棱两可:

...

提案:

CWG在科纳(Kona)进行了6比3的秸秆调查,以支持类范围查找; 这就是本文所建议的,将非静态数据成员的初始化程序限制为“ = initializer-clause ”和“ { initializer-list } ”形式。 我们相信:

问题1 :因为我们没有提出()表示法,所以不会发生此问题。 ={}初始化程序表示法不会遇到此问题。

除非您的编译器未采用复制省略(所有主要方法都采用了复制省略),否则笨拙的初始化方式不会有任何效率低下的情况。 问题在于C ++的语言设计师已经将自己摆在一个角落。 因为初始值设定项列表构造函数是贪婪的 ,所以花括号初始化将使用给定的元素构造一个向量,而使用括号的旧语法会调用显式构造函数来设置大小。

除非您不能在NSDMI中使用该构造函数。 除非使用等号。

如果由于某种原因打扰您,则有一些笨拙的解决方法:

std::vector<char> c = decltype(c)(123);
// ...
using VChar = std::vector<char>;
VChar v = VChar(123);

或认识到新功能并不排除现有功能:

std::vector<char> c;

A() : c(123)
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM