代码之家  ›  专栏  ›  技术社区  ›  pseyfert

使用C++14构建包折叠表达式(C++17扩展)时可用

  •  0
  • pseyfert  · 技术社区  · 6 年前

    以下代码包含一个fold表达式,afaiu是c++17的一个特性:

    template <typename... T> static bool variable_length_or(const T ... v) {
      return (v || ...);
    }
    
    bool foo () {
       return variable_length_or(true, false, true, false);
    }
    

    我觉得奇怪的是g++和clang++在构建 -std=c++14 ( compiler-explorer )中。它们确实会发出警告:

    <source>:2:16: warning: pack fold expression is a C++17 extension [-Wc++17-extensions]
    
     return (v || ...);
    

    这在一定程度上表明,在C++17之前,我写的东西是不好的,但是编译成功了,代码似乎做了它应该做的事情。我本以为编译会失败的。

    关于编译器为什么接受我的fold表达式有什么解释吗?

    (信用到期时的信用:我从 this 我可以检查一下 T bool 与建议相似 here )

    2 回复  |  直到 6 年前
        1
  •  3
  •   Barry    6 年前

    一致的C++ 17编译器必须提供折叠表达式。但这是一个有用的语言特性,值得积极 禁用 只是因为你在用以前的语言模式编译?

    允许实现提供扩展,前提是它们不会改变格式良好的程序的行为( [intro.compliance]/8 )中。前C ++ 17中的折叠表达式只是这样的扩展——它们纯粹是加性的。因此,在C++ 14模式中允许和不允许折叠表达式之间的效用权衡问题,似乎GCC和CLAN都倾向于倾向于允许。

    当然,你不应该 依靠 在这一点上,如果你想写C++ 17代码,你应该在C++ 17中编译。如果需要依赖它的帮助,可以使用 -pedantic-errors :

    当基本标准出现错误时(请参见 -Wpedantic )需要诊断,在某些情况下,在编译时存在未定义的行为,在某些情况下,不阻止编译根据标准有效的程序这不等于 -Werror=pedantic ,因为此选项启用了错误,而后者不启用,反之亦然。

        2
  •  1
  •   max66    6 年前

    如果你不添加 -ansi -pedantic ,为了严格遵守标准,编译器可以自由地采用一些扩展,或者在本例中采用以下标准的元素。

    -ansi-学究式 是我为g++和clang++添加的选项;显然,其他编译器可以使用不同的选项。

    --编辑--

    如巴里所指(谢谢!), -ansi 已经不再有用了 -pedantic .

    如路人所指(谢谢!),可以使用 -pedantic-error 在不严格遵守的情况下,强加一个错误,而不仅仅是一个警告。