gpt4 book ai didi

C++ 构造函数采用大小为 1 的 std::initializer_list

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

下面的示例程序代码背后的想法是说明这样一个事实,即当只给定一个元素时,拥有一个不等同于默认复制构造函数的初始化列表构造函数可能会导致 Clang 以某种方式出现意想不到的结果。

它还表明 Clang 和 GCC 没有在复制构造函数和初始化列表构造函数之间实现相同的优先级,这实际上使得可移植代码不可能使用这种初始化列表构造函数。

// Include directive.
#include <initializer_list>

// The struct used in this case.
struct Foo
{
// Member value.
int val;

// Default constructor.
Foo() : val(0) {}

// Initializer list constructor.
Foo(std::initializer_list<Foo>) : val(2) {}
};


// Main function.
int main()
{
// Default constructed Foo object.
Foo foo_zero;

// It is not clear to me which constructor
// should be called by the following statement.
Foo foo_test = { foo_zero };

// Return exit code.
// Clang 6.0.0 returns 0 (i.e. implicit copy constructor was called for 'foo_test').
// GCC 8.2 returns 2 (i.e. initializer list constructor was called for 'foo_test').
return foo_test.val;
}

我的问题如下:

  1. 我的示例程序的返回值应该是多少(Clang 和 GCC 似乎不一致)?

  2. 有没有办法使用适用于 Clang 和 GCC 的语法调用我的示例程序的初始化列表构造函数?

最佳答案

Clang 实现 DR 1467 (从 T 大括号初始化 T 的行为就好像您没有使用大括号一样)但尚未实现 DR 2137 (再想一想,只对聚合执行此操作)。

您的代码应返回 2。

一个可能的解决方法是 Foo foo_test({ foo_zero });

关于C++ 构造函数采用大小为 1 的 std::initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51665368/

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