繁体   English   中英

在构造函数中的default-construct对象中未声明变量

[英]Not declared variable in default-constructed object in constructor

上面的代码不起作用。 实际上, Foo构造f中的默认构造对象f抱怨值val未在范围中声明。 我不明白为什么没有宣布。

struct Foo2
{
  Foo2(int val)
  {}
};

struct Foo
{
  Foo(int val, Foo2 f = Foo2(val))
  {}
};

int main()
{
  Foo f(1);
  return 0;
}

根据C ++标准(8.3.6默认参数):

9每次调用函数时都会计算默认参数。 函数参数的评估顺序未指定。 因此, 函数的参数不应在默认参数中使用 ,即使它们未被评估。 在默认参数之前声明的函数的参数在范围内,并且可以隐藏命名空间和类成员名称。

在任何C ++(不仅是C ++ 2014)中,您都可以重载构造函数。 例如

struct Foo
{
  Foo(int val )
  { Foo2 f(val); /*...*/ }
  Foo(int val, Foo2 f )
  {}
};

或者您可以使用委托构造函数(如果您的编译器支持新标准)

struct Foo
{
  Foo(int val ) : Foo( val, Foo2( val ) )
  {}
  Foo(int val, Foo2 f )
  {}
};

这就是语言的运作方式; 默认参数不能依赖于其他参数,因为它们的初始化顺序未指定。

在C ++ 11或更高版本中,您可以通过重载解决此问题:

Foo(int val) : Foo(val, Foo2(val)) {}
struct Foo2
{
    int x;
    Foo2(int val): x(val) {}
};

struct Foo
{
    int y;
    Foo2 f2;
    Foo(int val, Foo2 f): y(val), f2(f) {}
    Foo(int val): y(val), f2(val) {}
};

int main()
{
    Foo f(1);
}

您可以使用模板来解决此问题:

struct Foo2
{
  Foo2(int val)
  {}
};

template <int val>
struct Foo
{
  Foo(Foo2 f = Foo2(val))
  {}
};

int main()
{
  Foo<1> f = Foo<1>(); 
  return 0;
}

暂无
暂无

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

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