而不是
const auto && obj = create();
...写信只是
const auto object = create();
...或
const auto object{ create() };
的=
依赖于编译器eliding拷贝构造函数调用,但我不知道任何现存的编译器,它无法做到这一点。
获得的清晰度比国际海事组织提供的担保要重要得多(如果使用参考,请使用普通&
参考)。也就是说,避免让维护程序员浪费时间来理解参考的基本原理。如果明确指定了类型,那么可能是多态引用的情况,Petru Marginean的诡计,但是auto
这是不可能的,因此维护程序员在一段时间的付费时间内仍然摸不着头。
在另一方面,const T&&
可以是函数重载作为参数类型有用搭上临时作为参数的情况下,以同样的方式作为&&
限定符成员函数被认为具有足够有用将要通过在标准中。例如,即使我不建议这样做,如果存储了一个指向实际参数的指针供以后使用,那么可能不希望存储指向临时指针的指针,该临时指针最终会成为悬挂指针:
struct Expr{ virtual ~Expr(){} };
struct Sum_expr: Expr
{
const Expr* a_;
const Expr* b_;
Sum_expr(Expr const& a,Expr const& b): a_(&a), b_(&b) {}
template< class A >
Sum_expr(A&&, Expr const&& b) = delete;
template< class B >
Sum_expr(Expr const&& a, B&&) = delete;
};
auto main()
-> int
{
Expr a;
Expr b;
Sum_expr sum{ a, b };
Sum_expr sum2{ a, Expr() }; //! Nope, won't compile.
}
注:这里A&&
和B&&
同时支持右值和左值实际参数,即他们不一定右值引用,因为他们普遍引用。
但是,不是重载和区分的情况下,我认为我会使一个指针正式参数,即使一个指针技术上可以是一个空指针,因为就我所见,它与我习以为常的更清楚地传达意图。
Sum_expr(Expr const* a, Expr const* b);
你可以用'const auto&'完成同样的事情。 – StoryTeller
仅供参考,您可以在所需的时间点击YouTube视频,然后选择“当前时间复制视频网址”,该链接可直接链接到该时间点:https://youtu.be/dTeKf5Oek2c?t = 2937 – Tas
您应该或许可以解释为什么'const auto &&'在问题的主体中被认为没有用处。 – juanchopanza