问题 扣除指南,模板和子对象:哪个编译器是对的?


请考虑以下代码段:

struct S {
    S() {}

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

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

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

接受它 而GCC 拒绝代码 出现以下错误:

prog.cc:10:5:错误:演绎指南'S :: T(B &&) - > S :: T'必须在命名空间范围内声明

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


6675
2018-05-30 09:06


起源

一点 更复杂的例子 似乎在gcc和clang中仍然失败,所以不要过于乐观地使用clang编译嵌套演绎指南的能力:) - W.F.
@ W.F。显然CTAD不适用于模板类中的类;标准缺陷(请参阅我对链接答案的评论)。 - Rakete1111


答案:


根据 http://en.cppreference.com/w/cpp/language/class_template_argument_deduction

用户定义的演绎指南必须命名一个类模板,并且必须在类模板的同一语义范围内引入(可以是命名空间或封闭类),对于成员类模板,必须具有相同的访问权限,但演绎指南必须具有相同的访问权限。不成为该范围的成员。

所以铿锵似乎是对的。


13
2018-05-30 09:09



我看到了它,但我没有在标准中找到这条线上的东西。你可以帮忙吗? - skypjack
temp.deduct.guide? - Daniel Langr