gpt4 book ai didi

c++ - 支持函数转换为引用类型、标准中的漏洞或编译器错误?

转载 作者:行者123 更新时间:2023-12-01 13:05:38 25 4
gpt4 key购买 nike

根据标准,带支撑的功能转换总是产生一个纯右值,[expr.cast]/2

Otherwise, the expression is a prvalue of the specified type whose result object is direct-initialized with the initializer.



当指定类型是引用类型时,这很难解释,因为它可能发生在泛型编程中。在这种情况下,编译器采用了特定的行为:
#include <type_traits>

struct A {
A ()=default;
A (const A&);
};

template <class T, class U>
decltype(auto)
f(U& a) {
static_assert (std::is_same_v <decltype (T{a}), T>);
return T{a};
}


#if defined(__clang__) || defined(_MSC_VER)
void g1(A a){
decltype(auto) v = f<A&>(a); //GCC: error try to bind a prvalue to a non-const lvalue
static_assert (std::is_same_v <decltype(v), A&>);
}
#endif

void g2(A a){
decltype(auto) v = f<const A&>(a); //GCC: call the copy constructor of A
//MSVC and Clang: a no op (direct reference binding)
static_assert (std::is_same_v <decltype(v), const A&>);
}

对于 Clang,GCC 和 MSVC 同意 decltype(T{a})在哪里 T is A&A& 类型.这意味着根据 decltype 规范,结果不是纯右值。所以看起来这些编译器都不符合标准。

评价 T{a}对于 Clang 和 MSVC 来说只是直接引用绑定(bind)。

GCC 拒绝编译 g1 .表达式 T{a}构建 a 的拷贝然后临时绑定(bind)到 T{a} 的结果(这可以在模板 h here 的显式实例化的组装中看到)。

在这种情况下是否有任何编译器正确?或者它只是一个“不需要诊断”的案例?

最佳答案

这是CWG1521 :

T{expr} with reference types

According to 8.2.3 [expr.type.conv] paragraph 4,

Similarly, a simple-type-specifier or typename-specifier followed by a braced-init-list creates a temporary object of the specified type direct-list-initialized (11.6.4 [dcl.init.list]) with the specified braced-init-list, and its value is that temporary object as a prvalue.


此措辞不处理 T 的情况。是引用类型:不可能创建该类型的临时对象,并且可能结果将是 xvalue,而不是 prvalue。

关于c++ - 支持函数转换为引用类型、标准中的漏洞或编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62325198/

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