简历限定符和概念参考需要参数

  • 本文关键字:参考 参数 c++ c++20
  • 更新时间 :
  • 英文 :


假设我有一个deserialize函数:

template <typename T>
T deserialize(const std::string& src);
// Specialized for various types
// ...

,并希望为deserialize专门化的类型定义Deserializable概念。以下版本有什么不同吗?

template <typename T>
concept Deserializable = requires(std::string s) { deserialize<T>(s); };
// concept Deserializable = requires(std::string& s) { deserialize<T>(s); };
// concept Deserializable = requires(const std::string s) { deserialize<T>(s); };
// concept Deserializable = requires(const std::string& s) { deserialize<T>(s); };

如果requires类似于正常函数,那么我期望第1 (resp)。第3个版本与第2个版本相同。4)版本,因为普通函数体中的名称s是左值。但是,我看到标准库使用引用类型作为requires参数,例如:

template< class T >
concept range = requires(T& t) {
ranges::begin(t); // equality-preserving for forward iterators
ranges::end  (t);
};

,这似乎暗示了引用与值的关系。

更一般地说,cv限定符和requires参数的引用重要吗?

更新:我提出了一个测试,以表明requires确实似乎表现得像正常的函数:

template <typename T>
void f(T&&, T&&) {}
template <typename T>
concept Foo = requires(int x, int& y, int&& z) {
f(x, y);
f(x, z);
f(x, 123);  // won't compile: deduced int& and int
};
int main()
{
}

所以看起来上面标准库示例中的requires(T& t)requires(T t)没有什么不同。总是这样吗?

如果T是右值引用类型U&&,T&U&,但只有当使用decltype或类似std::forward时才有关系。唯一的另一个形式上的区别是,它阻止了参数被调整如果是数组或函数类型,则为指针,这也很少有关系。

它也可能意味着避免暗示一个类型是可复制/可移动的(通常需要按值函数参数)。

最新更新