C++ 'requires'在类中具有类型requirement将无法编译[重复]

jslywgbw  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(151)

此问题已在此处有答案

Why do we require requires requires?(5个答案)
3天前关闭。
这段代码不会在任何C++兼容编译器(Clang,GCC,MSVC)上编译:

template<typename T>    
    requires(T t) { typename T::name; }
class MyVector
{    
};

错误:

--- Clang ----
    <source>:9:14: error: 'T' does not refer to a value
        requires(T t) { typename T::name; }
                 ^
    <source>:8:19: note: declared here
    template<typename T>    
                      ^
 --- GCC ----
    <source>:9:16: error: expected primary-expression before 't'
        9 |     requires(T t) { typename T::name; }

 --- MSVC ----
    <source>(9): error C2760: syntax error: 't' was unexpected here; expected ')'
    <source>(9): error C2059: syntax error: ')'

但这将:

template<typename T>    
        requires std::is_integral_v<T>   &&
        requires(T t) { typename T::name; }
class MyVector{};

有趣的是,这也将编译罚款!

template<typename T>    
            requires true   &&
            requires(T t) { typename T::name; }
 class MyVector{};

我知道可以使用concept来代替,但我只尝试了requires

wwtsj6pe

wwtsj6pe1#

requires(T t) { typename T::name; }是一个 requires-expression
然而,在模板声明的模板头下,你可以(可选地)只放一个 requires-clause,而不是 requires-expression

  • requires-clause* 也使用requires关键字,但与 requires-expression 的含义不同。requires-clause 具有requires E的形式,其中E是由约束表达式的合取/析取形成的表达式。原子约束可以是 requires-expression
template<typename T>    
requires requires(T t) { typename T::name; }

在两个

template<typename T>    
requires std::is_integral_v<T>   &&
    requires(T t) { typename T::name; }

template<typename T>    
requires true   &&
    requires(T t) { typename T::name; }

你正在使用正确的语法。第一个requires引入了 requires-clause&&是各个约束表达式之间的连接,第二个requires引入了 requires-expression 作为约束表达式之一。

相关问题