正向引用是用来将参数转发到另一个函数的,是吗?那为什么它不是const的呢?
template <typename T>
void func(const T&&);
非 const 引用允许函数修改其参数(而不仅仅是转发它们)。
正向引用是用来将参数转发到另一个函数的,是吗?那为什么它不是const的呢?
template <typename T>
void func(const T&&);
const T&&
中,它根本不是转发引用1。struct S {
S() = default;
S(S&&) = default; // move
S(const S&) = default; // copy
};
void foo(S fooarg);
template <typename T>
void bar(T&& bararg) { // forwarding reference
foo(std::forward<T>(bararg));
}
// call site
S s;
bar(s); // 1 copy
bar(S{}); // 2 move
bar(std::move(s)); // 3 move
bararg
移动到fooarg
,而在第一种情况下,我们希望将其复制。通过转发引用可以实现这一点。常量右值引用无法实现此功能,因为无法将常量引用传递给移动构造函数。
template <class T> void as_const(const T&&) = delete;
template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;
const
会防止参数成为转发引用,从而绑定到任何东西并使任何调用都被删除。constexpr const T&& optional::operator*() const&&;
constexpr const T&& optional::value() const &&;
template <class T, class... Types>
constexpr const T&& get(const std::variant<Types...>&& v);
template< class T, class... Types >
constexpr const T&& get(const tuple<Types...>&& t) noexcept;
xvalue
命名约定上迷失了方向),但是可以这样说,ref(const T&&)
是为了禁止从临时对象进行构造吗? - alfCref(const T&&) = delete
是用来禁止从临时对象(即rvalue)进行构建操作的。如果是 ref(T&&) = delete
的话,那么它将防止所有的使用,因为转发引用会绑定到任何东西上。 - eerorikaT const&&
情况没有被未实现或删除吗? - alfC
T&&
或者T const&
。https://youtu.be/ZbVCGCy3mGQ?t=1194 - alfC