我最近看了这个视频,解释了 C++ 中精简概念的想法,今年可能会以 TS 的形式出现。现在,我还了解了通用引用/转发引用(如此处所述),并且 T&& 可以根据上下文有两种含义(即是否正在执行类型推导)。这自然会引出一个问题,概念将如何与通用引用相互作用?
具体来说,在下面的例子中,我们有
void f(int&& i) {}
int i = 0;
f(i); // error, looks for f(int&)
f(0); // fine, calls f(int&&)
和
template <typename T>
void f(T&& test) {}
int i = 0;
f(i); // fine, calls f(T&&) with T = int& (int& && = int&)
f(0); // fine, calls f(T&&) with T = int&& (int&& && = int&&)
但是如果我们使用概念会发生什么?
template <typename T>
requires Number<T>
void f(T&& test) {}
template <Number T>
void g(T&& test) {}
void h(Number&& test) {}
int i = 0;
f(i); // probably should be fine?
f(0); // should be fine anyway
g(i); // probably also fine?
g(0); // fine anyway
h(i); // fine or not?
h(0); // fine anyway
尤其是最后一个例子让我有点困扰,因为有两个相互冲突的原则。首先,以这种方式使用的概念应该像类型一样工作,其次,如果 T 是推导类型,则 T&& 表示通用引用而不是右值引用。
提前感谢您对此的澄清!