gpt4 book ai didi

c++ - 可变参数构造函数是否应该隐藏隐式生成的构造函数?

转载 作者:IT老高 更新时间:2023-10-28 12:51:37 33 4
gpt4 key购买 nike

可变参数构造函数是否应该隐藏隐式生成的构造函数,即默认构造函数和复制构造函数?

struct Foo
{
template<typename... Args> Foo(Args&&... x)
{
std::cout << "inside the variadic constructor\n";
}
};

int main()
{
Foo a;
Foo b(a);
}

不知何故,在阅读 this answer 后,我希望这不会打印任何内容,但它在 g++ 4.5.0 上打印 inside variadic constructor 两次 :( 这种行为正确吗?


在没有可变参数模板的情况下也会发生这种情况:

struct Foo
{
Foo()
{
std::cout << "inside the nullary constructor\n";
}

template<typename A> Foo(A&& x)
{
std::cout << "inside the unary constructor\n";
}
};

int main()
{
Foo a;
Foo b(a);
}

再次打印两行。

最佳答案

事实上,隐式声明的复制构造函数的声明并没有被禁止。由于重载决议的规则,它只是没有被调用。

隐式声明的复制构造函数的格式为 Foo(const Foo&)。重要的部分是它需要一个 const 引用。您的构造函数模板采用非常量引用。

a 不是 const,因此非 const 用户声明的构造函数模板优于隐式声明的复制构造函数。要调用隐式声明的复制构造函数,可以使 a const:

const Foo a;
Foo b(a);

或者您可以使用 static_cast 来获取对 a 的 const 引用:

Foo a;
Foo b(static_cast<const Foo&>(a));

描述这一点的重载解决规则主要在 C++0x FCD 的 §13.3.3.2/3 中找到。这个特殊的场景,结合了左值和右值引用,在第 303 页的各种示例中有所描述。


可变参数构造函数模板将抑制隐式声明的默认构造函数,因为可变参数构造函数模板是用户声明的,并且仅在没有用户声明的构造函数时才提供隐式声明的默认构造函数(C++0x FCD §12.1/5 ):

If there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared as defaulted.

可变参数构造函数模板不会抑制隐式声明的复制构造函数,因为只有非模板构造函数可以是复制构造函数(C++0x FCD §12.8/2、3 和 8):

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments.

A non-template constructor for class X is a move constructor if its first parameter is of type X&&, const X&&, volatile X&&, or const volatile X&&, and either there are no other parameters or else all other parameters have default arguments.

If the class definition does not explicitly declare a copy constructor and there is no user-declared move constructor, a copy constructor is implicitly declared as defaulted.

关于c++ - 可变参数构造函数是否应该隐藏隐式生成的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2953611/

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