gpt4 book ai didi

c++ - 调用基本构造函数时是否应该复制继承构造函数的参数?

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

对于以下程序:

#include <iostream>

struct Foo
{
Foo() { std::cout << "Foo()\n"; }
Foo(const Foo&) { std::cout << "Foo(const Foo&)\n"; }
~Foo() { std::cout << "~Foo()\n"; }
};

struct A
{
A(Foo) {}
};

struct B : A
{
using A::A;
};

int main()
{
Foo f;
B b(f);
}

海湾合作委员会提供:

$ g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
Foo()
Foo(const Foo&)
~Foo()
~Foo()

VS 2017(也在 C++17 模式下)给出:

Foo()
Foo(const Foo&)
Foo(const Foo&)
~Foo()
~Foo()
~Foo()

谁是对的,为什么?

(我们也不要忘记 VS 2017 没有正确执行强制复制省略。所以它可能只是拷贝是“真实的”,但 GCC 根据 C++17 规则省略了它,而 VS 没有...)

最佳答案

Visual Studio 似乎没有实现 P0136然而。正确的 C++17 行为是一个拷贝,原始的 C++14 行为是两个拷贝。


C++14 规则 ( N4140:[class.inhctor] ) 将解释:

struct B : A
{
using A::A;
};

作为:

struct B : A
{
B(Foo f) : A(f) { }
};

引入的构造函数在 p3 中指定,内存初始化器等价于 p8。因此,您得到了 Foo 的两个拷贝:一个进入 B 的合成构造函数,一个进入 A 的真实构造函数。


作为 P0136 的结果,C++17 规则非常不同 (N4659:[class.inhtor.init]):在那里,我们直接调用 A 的构造函数。这不像我们要向 B 添加新的构造函数 - 而且它不是一种可以用语言表达的机制。因为我们直接调用 A(Foo),所以这只是一个拷贝而不是两个。

关于c++ - 调用基本构造函数时是否应该复制继承构造函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240641/

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