【发布时间】:2020-09-03 16:58:42
【问题描述】:
以下代码取决于该概念是定义在类之前还是之后。目的是检查是否可以从T 构造Quantity。我已经把它去掉了,只显示了复制构造的测试。
template <typename T>
concept is_compatible = requires( T & t ) { Quantity( t ); }; // note: not Quantity<T> !
template <typename T>
class Quantity
{};
class X{};
int main()
{
std::cout << is_compatible<Quantity<X>>;
std::cout << is_compatible<X>;
}
对于给定的代码,输出是 00,而不是预期的 10。要获得预期的结果,必须在类之后定义概念。
对于上面的代码,我会想到两件事之一:
- 它按预期工作
- 编译器给出警告或错误(提示我们的错误,如果是一个错误)请注意,当使用例如
Quantity<T>而不是概念中的Quantity,会发出编译器错误,因为此时Quantity<T>没有意义。
我没想到第三个,沉默的选择!这可能有一个“很好的理由”,“因为编译器以某种方式工作”,但我发现这很有缺陷。
如果行为正确,编写此代码的更好方法是什么?
【问题讨论】:
标签: c++ templates compiler-warnings c++20 c++-concepts