【问题标题】:Deduction guides, templates and subobjects: which compiler is right?推导指南、模板和子对象:哪个编译器是正确的?
【发布时间】:2018-11-09 01:41:37
【问题描述】:

考虑以下 sn-p:

struct S {
    S() {}

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

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

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

Clang accepts it 而 GCC rejects the code 出现以下错误:

prog.cc:10:5: error: deduction guide 'S::T(B&&) -> S::T' 必须在命名空间范围内声明

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

【问题讨论】:

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

标签: c++ templates language-lawyer c++17 template-argument-deduction


【解决方案1】:

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

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

所以 clang 似乎是正确的。

【讨论】:

  • 我看到了,但我没能在标准中找到沿着这条线的东西。你能帮忙吗?
猜你喜欢
  • 2015-12-29
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2021-03-04
  • 1970-01-01
  • 2021-02-15
  • 2014-11-02
相关资源
最近更新 更多