下面是一个结构体,其中的模板化构造函数是外部定义的:
template <typename T>
struct Foo {
template <typename F>
Foo(F f);
};
template <typename T>
template <typename F>
Foo<T>::Foo(F f) {}
在-std=c++20
下clang is happy with this,如果我把add a requires
clause给模板化的构造函数,它仍然是happy,但是如果requires
子句提到了struct,它就是not happy:
x一个一个一个一个x一个一个二个x
海湾合作委员会does accept this。
clang拒绝它是对的吗?如果是,标准的哪一部分这么说?
如果你想知道为什么我有一个requires
子句来引用被构造的类型,那就是为了消除构造函数和移动构造函数的歧义,这样当F
和Foo
相同时,一个更大的requires
表达式中的下一个requires
子句就不会被求值。否则,它递归地依赖于自己。实际的代码更复杂。并且接受到F
的转发引用。
1条答案
按热度按时间mwkjh3gx1#
我认为这可能与编译器无法推导出T是什么有关。当在结构体中使用requires子句时,编译器需要能够示例化类模板,以便检查requires子句中指定的需求。2这意味着requires子句中使用的所有模板参数必须在作用域中,并且编译器必须能够推导出它们的类型。如果类模板还没有完全定义,编译器将无法示例化它,代码也将无法编译。需要说明的是,我不确定,因为我几乎没有使用过这个特性。