当前位置: 首页 > 知识库问答 >
问题:

非模板函数的尾随requires子句的编译器方差

顾池暝
2023-03-14

考虑以下示例:

void f() requires true { }
int main() { f(); }

CLANG(1)(DEMO)接受此程序,而GCC(1)(DEMO)拒绝此程序,并出现以下错误:

error: constraints on a non-templated function

请注意,约束表达式实际上可以用于Clang的情况,因为Clang拒绝了以下程序:

void f() requires false { }
int main() { f(); }  //  // error: no matching function for call to 'f'
    null

共有1个答案

戚均
2023-03-14

除另有说明外,以下所有标准参考均指N4861(2020年3月布拉格后工作草案/C++20 DIS)。

这是一个Clang bug,按照[dcl.decl]/4(以及[temp.constr.decl]/1)[强调我的],GCC拒绝该程序是正确的:

init-declarator或member-declarator中的可选requires子句只有在declarator声明模板函数([dcl.fct])时才会出现。当出现在声明符之后时,requires-子句称为尾随requires-子句。[...]

同一段落还包含一个(非规范性)示例,明确指出OP的示例格式不正确:

[示例:

void f1(int a) requires true;       // error: non-templated function

template<typename T>
auto f2(T a) -> bool requires true; // OK

// ...

-结束示例]

[示例:

void f1(int a) requires true; // OK

// ...

其中OP用例的非规范性示例被显式地显示为格式良好的。最初的意图可以说是允许基于类模板的模板参数来约束类模板的非模板成员函数:

#include <iostream>

template<bool B>
struct S {
    void f() requires   B  { std::cout << "true\n"; }
    void f() requires (!B) { std::cout << "false\n"; }
};

int main() { 
    S<true>{}.f();   // true
    S<false>{}.f();  // false
} 

在N4861中的[dcl.decl]/4的最终状态(用于C++20)中,这仍然是允许的,其中限制是模板函数(参见[temp.pre]/8中的模板实体,特别是[temp.pre]/8.3),它不仅包括函数模板(以及非模板和模板类模板的函数模板成员),还包括类模板的非模板成员函数。

叮当虫报告:

    null
 类似资料:
  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。

  • std=C14的g在函子类的模板方法(本身不是模板)上给我一个“无法推断模板参数'Key'”错误。我不知道为什么。代码看起来应该可以工作。 我正在实现一个2-3树,它有一个采用函子的层次顺序遍历方法。操作人员tree23代码基本上是这样的: 级别顺序遍历调用仿函数的函数调用操作符,向其传递两个参数。 函子非常简单:

  • 主要内容:编译JRXML文件,预览Jasper文件我们在上一章中生成了 JasperReport 模板(JRXML 文件)。该文件不能直接用于生成报表。它必须编译为 JasperReport 的原生二进制格式,称为Jasper文件。在编译时,我们将 JasperDesign 对象转换为 JasperReport 对象。 接口net.sf.jasperreports.engine.design.JRCompiler在编译过程中起着核心作用。该接口有

  • 你可能有兴趣知道,Vue 的模板实际是编译成了 render 函数。这是一个实现细节,通常不需要关心,但如果你想看看模板的功能是怎样被编译的,你会发现会非常有趣。下面是一个使用Vue.compile来实时编译模板字符串的简单 demo: <div> <header> <h1>I'm a template!</h1> </header> <p v-if="message">

  • 尽管 PHP 不断升级为成熟的、面向对象的语言,但它作为模板语言 没有改善多少。编译型模板,比如 Twig、Brainy 或 Smarty,提供了模板专用的新语法,填补了这片空白。从自动转义到继承以及简化控制结构,编译模板设计地更容易编写,可读性更高,同时使用上也更加的安全。编译型模板甚至可以在不同的语言中使用,Mustache 就是一个很好的例子。由于这些模板需要编译,在性能上会带来一些轻微的影

  • 以下内容将无法编译: null 我不明白这里到底出了什么问题。为什么编译器不能从函数参数推导出模板参数? 我需要做什么才能让这个工作?