c++ clang抱怨使用概念的模板化构造函数的定义不符合规范是对的吗?

w8f9ii69  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(95)

下面是一个结构体,其中的模板化构造函数是外部定义的:

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子句来引用被构造的类型,那就是为了消除构造函数和移动构造函数的歧义,这样当FFoo相同时,一个更大的requires表达式中的下一个requires子句就不会被求值。否则,它递归地依赖于自己。实际的代码更复杂。并且接受到F的转发引用。

mwkjh3gx

mwkjh3gx1#

我认为这可能与编译器无法推导出T是什么有关。当在结构体中使用requires子句时,编译器需要能够示例化类模板,以便检查requires子句中指定的需求。2这意味着requires子句中使用的所有模板参数必须在作用域中,并且编译器必须能够推导出它们的类型。如果类模板还没有完全定义,编译器将无法示例化它,代码也将无法编译。需要说明的是,我不确定,因为我几乎没有使用过这个特性。

相关问题