gpt4 book ai didi

c++ - 引用限定的成员函数作为模板参数?

转载 作者:可可西里 更新时间:2023-11-01 16:42:36 24 4
gpt4 key购买 nike

这在 clang 3.3 中编译得很好:

template <typename T>
struct M;

template <typename R, typename C, typename... A>
struct M <R (C::*)(A...)> { };

template <typename R, typename C, typename... A>
struct M <R (C::*)(A...) &> { };

但在 gcc 4.8.1 中失败:

[...] error: redefinition of ‘struct M <R (C::*)(A ...)>’
struct M <R (C::*)(A...) &> { };
^
[...] error: previous definition of ‘struct M <R (C::*)(A ...)>’
struct M <R (C::*)(A...)> { };
^

当在不同的上下文中使用时,这会导致各种意外的编译器行为,例如崩溃或内部编译器错误。

我知道 ref 限定的成员函数在标准中被称为“*this 的右值引用”( N2439 ),并且是 supported by gcc 4.8.1 .

这里的问题是将它们用作模板参数,其中 gcc 似乎不区分 ref 限定成员函数类型和普通成员函数类型。

clang 的std 库的实现似乎检测是否支持此功能

__has_feature(cxx_reference_qualified_functions)

那么,这种引用限定函数的使用是标准的,还是一种语言扩展?

最佳答案

根据 8.3.5 [dcl.fct] 第 6 段(我在引用的文本中添加了一些突出显示):

The return type, the parameter-type-list, the ref-qualifier, and the cv-qualifier-seq, but not the default arguments (8.3.6) or the exception specification (15.4), are part of the function type.

也就是说,ref-qualifier 肯定是类型的一部分。进一步根据 8.4.1 [dcl.fct.def.general] 第 5 段,您可以创建指向成员的指针,包括引用限定符:

A cv-qualifier-seq or a ref-qualifier (or both) can be part of a non-static member function declaration, non-static member function definition, or pointer to member function only (8.3.5); see 9.3.2.

没有特定限制,指向带有引用限定符的成员函数的指针不能用作非类型模板参数。也就是说,我认为您尝试使用的部分特化应该有效。然而,对 ref-qualifiers 的支持在 clang 和 gcc 中都是一个相当新的特性,也就是说,可能并不是所有的极端情况都被解决了。我用 gcc (20130811) 和 clang (trunk 190769) 的最新快照尝试了上面的片段,并且都编译了代码。当然,这个片段并没有真正做任何事情,我也没有试图滥用这个功能。我猜你只是触发了一些编译器错误,我相信这两个项目都会感谢针对他们最新快照的错误报告。

关于c++ - 引用限定的成员函数作为模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18746237/

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