我最近了解到可以将值分配给不同类型的引用。具体例子:
const std::optional<float>& ref0 = 5.0f;
const std::optional<float>& ref1 = get_float();
Run Code Online (Sandbox Code Playgroud)
这让我很惊讶。我当然希望这可以与非引用一起使用,但假设引用仅绑定到相同的类型。
我发现了 C++ 标准的一个很好的部分,其中讨论了其工作的各种方式: https: //eel.is/c++draft/dcl.init.ref#5。但我希望能得到一些见解:什么时候需要这样做?
最近这让我受伤的一个特殊场合是:
auto get_value() -> std::optional<float>{ /* ... */ }
const std::optional<float>& value = get_value();
// check and use value...
Run Code Online (Sandbox Code Playgroud)
后来我将函数的返回值更改为原始浮点数,预计所有引用类型的使用都会失败。他们没有。如果不注意,所有无用的检查代码都会留在原处。
根本原因之一是一致性。由于 const-reference 参数被广泛使用,不是为了引用语义而只是为了避免复制,所以人们会期望每个
void y(X);
void z(const X&);
Run Code Online (Sandbox Code Playgroud)
接受任何可以转换为X. 初始化局部变量具有相同的语义。
这种语法也曾经具有实用价值:在 C++03 中,函数的结果(包括转换)在理论上被复制:
struct A {A(int);};
struct B {operator A() const;};
void g() {
A o=B(); // return value copied into o
const A &r=3; // refers to (lifetime-extended) temporary
}
Run Code Online (Sandbox Code Playgroud)
已经获得删除这些副本的许可,在这种微不足道的情况下这样做很常见,但参考文献保证了这一点。