关于requires表达式中T是否需隐式拷贝构造函数的技术问询
关于requires表达式中值传递参数的隐式拷贝构造要求
问题描述
在如下的concept定义中,由于requires参数是按值传递的T a, T b,是否要求类型T必须具备隐式拷贝构造函数?还是这个表达式的行为类似decltype,不会触发实际的构造操作?
代码示例:
template<typename T> concept Addable = requires (T a, T b){ a + b; };
结论与解释
答案是:不需要T具备隐式拷贝构造函数,requires表达式的参数声明不会触发实际的对象构造,它的行为更接近decltype,只是在编译期检查表达式的合法性。
具体来说:
- 在requires表达式的参数列表里,
T a, T b这种写法并不是创建T的实例,而是声明编译期的「占位符」变量,用于后续表达式的合法性校验。 - 这里只需要确认
a + b这个表达式在编译期是有效的(比如T重载了operator+),不会涉及拷贝构造函数的实际调用,甚至不会要求拷贝构造函数存在——哪怕T是不可拷贝的类型(比如std::unique_ptr),只要operator+对它合法,这个concept就能被满足。
举个实际的例子,我们定义一个不可拷贝的类型:
struct NonCopyable { NonCopyable() = default; NonCopyable(const NonCopyable&) = delete; // 显式删除拷贝构造 NonCopyable operator+(const NonCopyable&) const { return {}; } };
这个类型依然能满足Addableconcept,因为requires表达式不会尝试拷贝它的实例。
内容的提问来源于stack exchange,提问作者Martin Fehrs
相关产品推荐
相关产品推荐

