C ++ 20概念:MSVC的行外定义失败,但在GCC或clang中不行

斯蒂芬·克塞尔

考虑一下这个小代码片段

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() {};

如此处所示 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。请参阅此示例

人工编译器

此行为是MSVC中的一个可观察到的偏差,通常在模板和SFINAE的上下文中已经看到。当声明不合格时(由于位于同一个命名空间中),MSVC往往难以对具有限定条件的模板进行脱机定义。在处理SFINAE形式时,我经常遇到此问题,而且现在看来concepts也必须发生这种情况

例如,MSVC拒绝有效的代码:

namespace nsp {

  template <typename T>
  using is_convertible_to_bool = std::is_convertible<T, bool>;

  template <typename T, std::enable_if_t<is_convertible_to_bool<T>::value,int> = 0>
  void example(const T& x);

} // namespace nsp

template <typename T, std::enable_if_t<nsp::is_convertible_to_bool<T>::value,int>>
void nsp::example(const T& x)
{

}

Live Example

但是,MSVC将接受相同的代码,只要你上添加资格is_convertible_to_boolnamespace nsp

  template <typename T, std::enable_if_t<nsp::is_convertible_to_bool<T>::value,int> = 0>
  //                                     ^~~~~ fixes it
  void example(const T& x);

Live example

同样,如果将的定义更改struct C为包含完全限定的概念名称,则代码示例实际上可以工作

    template<nsp::Addable T>
    //       ^~~~~
    //       Qualifying here fixes the failure in MSVC
    struct C
    {
        C();
    };

Live Example


我没有时间检查编译器正确的查找规则的标准(如果没有其他答案,稍后将进行检查),但是我的期望实际上是MSVC提供了错误的行为。基本名称查找应在两个定义中选择相同的类型,因此代码格式正确。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ 20中的概念

来自分类Dev

当涉及c ++ 20概念时,gcc和clang之间的行为不一致

来自分类Dev

在c ++ 20概念中使用clang格式

来自分类Dev

在GCC中,Clang和MSVC是否有符合C ++ 98而不是C ++ 03的方法?

来自分类Dev

具有容器迭代器的c ++中的循环类型依赖性(GCC失败,而MSVC正常)

来自分类Dev

C++ MSVC/GCC/Clang 编译器错误

来自分类Dev

C ++ 20外的类定义在模板类

来自分类Dev

转角半径在Obj-C上运行,但在Swift中不行

来自分类Dev

C ++ 20概念测试在MSVS 16.5中不起作用

来自分类Dev

为什么C ++ 20中没有枚举概念?

来自分类Dev

自引用C ++ 20概念

来自分类Dev

C ++在GCC上使用已删除功能,但在MSVC上不使用

来自分类Dev

函数定义与C中的声明不匹配,但在C ++中

来自分类Dev

实现与C ++ 20概念配对的概念

来自分类Dev

clang 10 C ++ 20概念如何为类方法指定复合要求?

来自分类Dev

使用c ++ 20概念和模板化类的奇怪的GCC(树干)行为:是Bug还是功能?

来自分类Dev

C ++中的“ Nil”的概念

来自分类Dev

C ++中的重载概念

来自分类Dev

在C(GCC)中定义数据类型

来自分类Dev

在C(GCC)中定义数据类型

来自分类Dev

下述概念如何在C ++ 14中定义?

来自分类Dev

C ++中的lambdas重载以及clang和gcc之间的区别

来自分类Dev

C ++ 11:模板参数中的SFINAE,GCC与Clang

来自分类Dev

C ++中的Lambda表达式,OS X的clang与GCC

来自分类Dev

从gcc / clang(C ++)的功能范围中获取标签地址

来自分类Dev

C ++ 20中非类型文字参数对模板的部分专业化:clang和gcc意见不一致

来自分类Dev

C ++ 20概念:多个返回类型要求?

来自分类Dev

复杂浮点类型的C ++ 20概念

来自分类Dev

实现C ++ 20 bidirectional_iterator概念

Related 相关文章

热门标签

归档