身体是否需要阻止未评估的背景?

时间:2017-04-18 15:01:04

标签: c++ c++-concepts

是概念定义的主体还是需要阻止未评估的上下文?例如。我能安全地使用std::declval吗?

template<typename T>
concept bool SomeConcept = requires(T a) {
    { a.someFunction(std::declval<int>()) } -> int;
};

1 个答案:

答案 0 :(得分:14)

是。来自[temp.constr.expr],N4641的措辞:

  

表达式约束是一个约束,它通过替换模板参数来指定对表达式 E的形成的要求。如果产生E的替换没有失败,则满足表达式约束。 在表达式约束中,E是未评估的操作数(第5条)。

所以使用declval应该没问题。

或者,您可以创建所需类型的对象,因为在需求的上下文中,我们实际上并没有构建任何东西:

template<typename T>
concept bool SomeConcept = requires(T a, int i) {
    { a.someFunction(std::move(i)) } -> int;
};