gpt4 book ai didi

c++ - 使用 'template' 关键字为转换函数模板的显式访问添加前缀是否合法?

转载 作者:行者123 更新时间:2023-12-01 14:20:06 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is it possible to call templated user-defined conversion operator with explicit template arguments?

(2 个回答)


去年关闭。




考虑以下程序:

struct A {
template <typename T>
operator T() { return T{}; }
};

int main() {
(void) A{}.operator int(); // (A)
(void) A{}.template operator int(); // (B)
}
(A) 被 GCC 和 Clang 接受,而 (B) 只被 GCC 接受但被 Clang 拒绝,并显示以下错误消息:
error: expected template name after 'template' keyword in nested name specifier

(void) A{}.template operator int(); // (B)
^~~~~~~~~~~~

Afaict,(B) 应该是合法的,根据 [temp.names]/5 :

A name prefixed by the keyword template shall be a template-id or the name shall refer to a class template or an alias template. [ Note: The keyword template may not be applied to non-template members of class templates.  — end note ] [ Note: As is the case with the typename prefix, the template prefix is allowed in cases where it is not strictly necessary; i.e., when the nested-name-specifier or the expression on the left of the -> or . is not dependent on a template-parameter, or the use does not appear in the scope of a template.  — end note ]


以及受 [temp.names]/4 管辖的禁令不适用:

The keyword template is said to appear at the top level in a qualified-id if it appears outside of a template-argument-list or decltype-specifier. [...] an optional keyword template appearing at the top level is ignored. [...]


并且,至多只声明应该忽略关键字(但不是程序格式错误)。
我在 [class.conv.fct] 中没有找到任何条款或 [temp.deduct.conv]这与这个论点相冲突。

  • 使用 template 前缀显式访问转换函数模板是否合法?关键词?

  • 我已经用各种语言标准版本的各种 GCC 和 Clang 版本测试并重复了上述编译器的行为,但对于这个问题的范围,我们可能会关注 海湾合作委员会 10.1.0 Clang 10.0.0 -std=c++17 .

    最佳答案

    GCC错误接受程序:一个转换函数模板名(conversion-function-id)不是一个模板ID
    这是 CWG Defect Report 96 ,截至 GCC 10,尚未解决。相关的bug GCC 票55588提到它正在为 GCC 11 实现。

    正如对 Is it possible to call templated user-defined conversion operator with explicit template arguments? 的回答所涵盖的那样, 转换函数模板名称不命名模板id;引用来自 [temp.names]/1 的 template-id 中的语法:

    simple-template-id:
    template-name < template-argument-list_opt>

    template-id:
    simple-template-id
    operator-function-id < template-argument-list_opt>
    literal-operator-id < template-argument-list_opt>

    template-name:
    identifier

    因此,正如 OP 中引用的那样,根据 [temp.names]/5, template关键字不能用于作为转换函数模板名称的前缀,因为后者不是模板 ID。
    指出 Clang 在引用 operator-function-id(它是模板 id)时不会拒绝使用关键字可能会很有趣:
    struct A {
    template <typename T>
    T operator+() { return T{}; }
    };

    int main() {
    (void) A{}.operator+<int>(); // (A)
    (void) A{}.template operator+<int>(); // (B)
    }
    如上所述,GCC 接受 OP 的程序是一个错误,因为它违反了 [temp.names]/5。

    关于c++ - 使用 'template' 关键字为转换函数模板的显式访问添加前缀是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63044894/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com