gpt4 book ai didi

c++11 - 为什么对于这个未命名的临时构造函数被省略,具有正常初始化的副作用而不是括号列表初始化?

转载 作者:行者123 更新时间:2023-12-03 08:11:58 25 4
gpt4 key购买 nike

我想测试一个临时对象是否至少与保存对它的 const 引用的临时对象一样长,所以我想出了这个例子。

#include <iostream>

struct Test {
Test() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
~Test() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};

struct Holder {
Holder(const Test& t):m_t(t) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
~Holder() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

const Test& m_t;
};

int main() {
Holder(Test());

return 0;
}

但是,我很惊讶地看到编译器实际上已经优化了整个事情,正如在codebolt 上看到的那样

但是,如果我实际上通过更改行给临时文件一个名称

Holder(Test());

进入

Holder h((Test()));

然后它“神奇地”起作用了:codebolt .

情节扭曲:如果我切换到 c++11 并为 Holder 类使用花括号列表初始化,那么无论我是否给出构造函数都不会被省略暂时要不要一个名字。参见 codebolt再次。

那么这是怎么回事呢?我的印象是永远不会省略具有副作用的构造函数,但我显然遗漏了标准中在版本之间发生变化的重要部分。

有人可以给我提示吗?

最佳答案

这是 most vexing parse issue : Holder(Test()); 声明了一个名为 Test 的函数,该函数返回 Holder 并接受 0 个参数。

使用 g++ 执行以下代码:

#include <iostream>
#include <type_traits>

struct Test {};
struct Holder { Holder(Test); };

template<class T>
char const* f() { return __PRETTY_FUNCTION__; }

int main() {
Holder(Test());
std::cout << f<decltype(&Test)>() << '\n';
}

输出:

const char* f() [with T = Holder (*)()]

一个简单的解决方法是使用 C++11 大括号进行初始化:Holder(Test{});Holder{Test{}};

关于c++11 - 为什么对于这个未命名的临时构造函数被省略,具有正常初始化的副作用而不是括号列表初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42095502/

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