扣除指南、模板和子对象:哪个编译器是正确的?

16

Consider the following snippet:

struct S {
    S() {}

    template<typename B>
    struct T {
        T(B &&) {}
    };

    template<typename B>
    T(B &&) -> T<B>;
};

int main() {
    S::T t{0};
}

Clang 接受 了它,而GCC则用以下错误信息拒绝了这段代码:

prog.cc:10:5: error: deduction guide 'S::T(B&&) -> S::T' must be declared at namespace scope

这是有效的代码吗?哪个编译器是正确的,GCC还是Clang?


一个稍微复杂一点的例子似乎仍然无法在gcc和clang中编译成功,所以不要对clang编译嵌套推导指南过于乐观 :) - W.F.
@W.F. 显然,CTAD 对于模板类内部的类不起作用;这是标准缺陷(请参见我在链接答案中的评论)。 - Rakete1111
现在已在GCC 12中修复(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79501) - Desmond Gold
1个回答

15

1
我看到了,但是在标准中没有找到类似的东西。你能帮忙吗? - skypjack
@skypjack 来自[temp.deduct.guide] :“一个模板参数推导指南必须存在于相应类模板所属的作用域中,并且对于成员类模板,具有相同的访问权限。” - El Mismo Sol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接