c++ 构造函数调用中的圆括号与卷括号

63lcw9qa  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(158)

以下代码按预期工作并获得结果:

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()却很好?

20jt8wwn

20jt8wwn1#

@RemyLebeau是对的。不允许对引用进行值初始化,而对{}的引用进行列表初始化则需要创建一个临时的。
[dcl.init]:
调用引用类型实体的默认初始化或值初始化的程序是病态的。
[dcl.init.list]:
T类型的对象或引用的列表初始化定义如下:

  • [...]
  • 否则,如果T是引用类型,则T引用的类型的纯右值临时变量被列表初始化,并且引用被绑定到该临时变量。

相关问题