gpt4 book ai didi

c++ - Clang vs G++ 左值到右值转换

转载 作者:行者123 更新时间:2023-12-02 10:15:30 26 4
gpt4 key购买 nike

问题 相关 到这个one .通过追踪 slt_pair. hmove. h ,似乎 之间的区别铿锵 G++ 是内部的。我试图模拟对象(pair.first)的分配,与 std_pair.h 的实现相同。 ,输出与 相同铿锵 输出它是合理的输出,但是为什么在使用对时它会发生变化。

#include <iostream>

struct Foo {
Foo() {
std::cout << "default" << std::endl;
}
Foo(Foo& f2) {
std::cout << "non-const" << std::endl;
}
Foo(const Foo& f2) {
std::cout << "const" << std::endl;
}
};

// static_cast Foo lvalue to rvalue
Foo cast1(Foo foo){

return static_cast<Foo&&>(foo);
}

// same : check weather foo and Foo are the same type
Foo cast2(Foo foo){
return static_cast<typename std::remove_reference<Foo>::type&&>(foo);
}

int main() {

Foo T1; // pair Foo object

std::cout<<"Start"<<std::endl;
std::cout<<std::endl;


// (&&) rvalue casting
T1 = cast2(Foo()); // First pair object

std::cout << std::endl;

Foo const foo = T1;// Second pair object

}
如何 铿锵 处理转换 lvaluervalue以及这些不同输出的真正原因是什么。

任何意见都非常感谢,谢谢。
更新 :我在接受的评论部分得到了令人满意的答案。

最佳答案

我认为并非您示例中的所有内容都按照您的想法进行。 static_cast在返回是没有意义的,cast1 的结果和 cast2将自动成为右值,因为您按值返回。此外,cast1cast2std::remove_reference_t<Foo> 起在内部也是相同的只是 Foo .您需要 remove_reference如果你有一些模板正在进行。

此外,您将作业与结构混合在一起。在 T1 = cast2(Foo());发生以下情况:

  • Foo() 构造了一个未命名的临时.这将输出 default
  • 此临时复制到 foo cast2 的论点.这将输出 const , 因为我们试图构造一个 Foo来自临时的对象,并且只有 const Foo& ,而不是 Foo& ,可以绑定(bind)到一个临时的。
  • static_cast几乎什么都不做。
  • foo被退回。通过返回值优化,不调用应该调用的构造函数。
  • 我们使用默认(和隐式)赋值运算符 T1.operator=(const Foo&) 来分配返回值.没有任何东西被打印出来。

  • Foo const foo = T1你调用一个构造函数。由于 T1是一个左值,你会调用构造函数 Foo(Foo&)non-const被打印。

    关于c++ - Clang vs G++ 左值到右值转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62128493/

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