const ref 绑定到不同类型的基本原理?

Bas*_*sti 7 c++

我最近了解到可以将值分配给不同类型的引用。具体例子:

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)

后来我将函数的返回值更改为原始浮点数,预计所有引用类型的使用都会失败。他们没有。如果不注意,所有无用的检查代码都会留在原处。

Dav*_*ing 5

根本原因之一是一致性。由于 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)

已经获得删除这些副本的许可,在这种微不足道的情况下这样做很常见,但参考文献保证了这一点。