在以下代码中:
#include <memory>
struct A;
std::unique_ptr<A> ok() { return {}; }
std::unique_ptr<A> error() { return std::unique_ptr<A>{}; }
Clang++可以编译ok()
函数,但会拒绝带有错误信息的error()
函数:
In file included from /opt/compiler-explorer/gcc-11.1.0/lib/gcc/x86_64-linux-gnu/11.1.0/../../../../include/c++/11.1.0/memory:76:
/opt/compiler-explorer/gcc-11.1.0/lib/gcc/x86_64-linux-gnu/11.1.0/../../../../include/c++/11.1.0/bits/unique_ptr.h:83:16: error: invalid application of 'sizeof' to an incomplete type 'A'
static_assert(sizeof(_Tp)>0,
Demo: https://gcc.godbolt.org/z/M8qofYbzn
C++中默认构造对象返回和使用空大括号返回之间是否存在任何真正的区别?(无论是一般情况还是在这个特定案例中)
ok
的优化汇编是做了什么吗?mov rax, rdi; mov qword ptr [rdi], 0; ret
我怀疑是返回值优化,但不确定。 - Quimbyrdi
中,调用者将返回对象的存储地址传递给ok
函数。ok
函数通过默认构造函数初始化该对象,该构造函数仅将其成员指针设置为nullptr
。这相当于通过mov
指令将其二进制表示设置为零字节。最后,对象的地址在rax
中返回。 - Daniel Langr