以下代码按预期工作并获得结果:
ASM generation compiler returned: 0
Execution build compiler returned: 0
Program returned: 0
same
same
same
#include <iostream>
#include <type_traits>
struct Test {
Test() {
std::cout << "Test ctor\n";
}
int func() {
return 1;
}
};
int main() {
if (std::is_same_v<decltype(std::add_rvalue_reference<Test>::type{}.func()),int>) {
std::cout <<"same\n";
} else {
std::cout <<"different\n";
}
if (std::is_same_v<decltype(Test().func()),int>) {
std::cout <<"same\n";
} else {
std::cout <<"different\n";
}
if (std::is_same_v<decltype(std::type_identity<Test>::type().func()),int>) {
std::cout <<"same\n";
} else {
std::cout <<"different\n";
}
}
但是,如果我将std::add_rvalue_reference<Test>::type{}
替换为std::add_rvalue_reference<Test>::type()
,则会生成以下编译错误:
<source>:14:33: error: reference to type 'Test' requires an initializer
if (std::is_same_v<decltype(std::add_rvalue_reference<Test>::type().func()),int>) {
^
1 error generated.
ASM generation compiler returned: 1
<source>:14:33: error: reference to type 'Test' requires an initializer
if (std::is_same_v<decltype(std::add_rvalue_reference<Test>::type().func()),int>) {
^
1 error generated.
Execution build compiler returned: 1
有谁知道是什么原因导致std::add_rvalue_reference<Test>::type()
无法调用Test
的构造函数,而Test()
和std::type_identity<Test>::type()
却很好?
1条答案
按热度按时间20jt8wwn1#
@RemyLebeau是对的。不允许对引用进行值初始化,而对
{}
的引用进行列表初始化则需要创建一个临时的。[dcl.init]:
调用引用类型实体的默认初始化或值初始化的程序是病态的。
[dcl.init.list]:
T
类型的对象或引用的列表初始化定义如下:T
是引用类型,则T
引用的类型的纯右值临时变量被列表初始化,并且引用被绑定到该临时变量。