相关疑难解决方法(0)

将 xvalue 作为左值呈现的有效性

以下函数(按照我的意图)是获取右值并将其呈现为左值。

auto constexpr RtoL = [](auto&& r) -> decltype(auto) {
    static_assert(std::is_rvalue_reference_v<decltype(r)>, "Gimme rvalues, not lvalues.");
    return (r);
};
Run Code Online (Sandbox Code Playgroud)

我考虑在我可以保证 xvalue 没有真正被移动的情况下使用它(例如,它通过 转换为右值std::move,但没有利用它),所以我会用 xvalues 来调用它,而不是纯右值。

不管怎样,编译器(好吧,GCC 的版本)似乎对上面代码的有效性有不同的看法。具体来说,考虑到这种用法:

auto constexpr RtoL = [](auto&& r) -> decltype(auto) {
    static_assert(std::is_rvalue_reference_v<decltype(r)>, "Gimme rvalues, not lvalues.");
    return (r);
};
Run Code Online (Sandbox Code Playgroud)

GCC 11.2 认为它无效:

int main() {
    int x{3};
    RtoL(std::move(x));
}
Run Code Online (Sandbox Code Playgroud)

而 GCC 10.3 和其他编译器认为它是有效的。

此外,将 return 语句从

return (r);
Run Code Online (Sandbox Code Playgroud)

return static_cast<decltype(r)&>(r);
Run Code Online (Sandbox Code Playgroud)

让他们都同意代码是正确的。

从标准的角度来看,真相在哪里?

c++ language-lawyer move-semantics xvalue c++17

11
推荐指数
1
解决办法
202
查看次数

GCC的decltype(auto)不符合标准?

我尝试使用不同的选项在GCC 8.2下编译这个C++代码,它总是成功,不产生警告和输出true:

int && a = 123;
decltype(auto) b = a;

std::cout << std::boolalpha << std::is_same<decltype(b), int&>::value;
Run Code Online (Sandbox Code Playgroud)

同时,相同的代码不会在Clang中编译,如果我对标准的理解是正确的,那就是符合标准的行为.

cppreference decltype:

如果参数是未加密码的id-expression或未加括号的类成员访问表达式,则decltype将生成此表达式命名的实体的类型.

cppreference decltype(auto):

如果声明的变量类型是decltype(auto),则将关键字auto替换为其初始化程序的表达式(或表达式列表),并使用decltype规则推导出实际类型.

因此,decltype(auto)应该屈服int&&.因为它a是一个左值,它不应该绑定b,导致编译错误.

那么海湾合作委员会是否不符合标准或者是否有我遗漏的东西?

c++ gcc clang decltype auto

8
推荐指数
1
解决办法
200
查看次数

标签 统计

c++ ×2

auto ×1

c++17 ×1

clang ×1

decltype ×1

gcc ×1

language-lawyer ×1

move-semantics ×1

xvalue ×1