【发布时间】:2021-01-13 12:50:03
【问题描述】:
考虑一下这个小代码sn-p
namespace nsp
{
template<typename T>
concept Addable= requires(const T& a,const T& b)
{
{a + b} -> std::convertible_to<T>;
};
template<Addable T>
struct C
{
C();
};
}
template<nsp::Addable T>
nsp::C<T>::C() {};
如图所示here GCC (10.2) 和 clang (11.0) 接受代码,而 MSVC (x86 19.28) 拒绝它并显示错误消息:
error C3855: 'nsp::C<T>': template parameter 'T' is incompatible with the declaration.
这是一个 MSVC 错误还是 GCC 和 clang 错误地接受它?或者,我是不是有些愚蠢?如果我将离线定义移到命名空间 nsp 中,它似乎也适用于 MSVC。看到这个example。
【问题讨论】:
-
我似乎在那个名称下找不到这个特定的语言功能,但你知道en.cppreference.com/w/cpp/compiler_support 的存在吗?
-
@YVbakker 叫做“概念”,根据链接页面,MSVC 只支持部分。
-
No compiler supports all C++20 features。有些功能适用于 MSVC,但不适用于 GCC。 MSVC 更新不如 GCC 频繁。另一方面,对 GCC 的一个常见抱怨是编译器在您的脚下更改的频率。
-
@Yksisarvinen 啊太棒了!我今天也学到了一些新东西
-
@Hack20 c++20 标准已经完成。我们应该开始学习和适应它。我根本不会认为这是“匆忙”。
标签: c++ c++20 c++-concepts