如何提供嵌套模板推导指南class?

How to provide deduction guide for nested template class?

根据[temp.deduct.guide/3]:

(...) A deduction-guide shall be declared in the same scope as the corresponding class template and, for a member class template, with the same access. (...)

但下面的例子似乎并没有在 [gcc] and [clang].

中编译
#include <string>

template <class>
struct Foo {
    template <class T>
    struct Bar {
        Bar(T) { }
    };
    Bar(char const*) -> Bar<std::string>;
};

int main() {
    Foo<int>::Bar bar("abc");
    static_cast<void>(bar);
}

嵌套模板推导指南的正确语法是什么class?或者也许这个是正确的,但编译器还不支持它?


类似的语法但没有嵌套 class 在 gcc 和 clang 中编译都很好:

#include <string>

template <class T>
struct Bar {
    Bar(T) { }
};
Bar(char const*) -> Bar<std::string>;

int main() {
    Bar bar("abc");
    static_cast<void>(bar);
}

[temp.deduct.guide]包括句子:

A deduction-guide shall be declared in the same scope as the corresponding class template and, for a member class template, with the same access.

这表明您的示例应该有效 - 成员 class 模板明确支持演绎指南,只要它们在相同的范围和访问权限中声明(即 class范围和 public - 检查并检查)。

这是 gcc bug 79501(由 Richard Smith 提交)。

如果您确实需要临时快速修复,请考虑使用特定于编译器的说明。

Here, on godbolt

关键是通过添加特定于编译器的指令来处理 GCC 和 Clang 之间的行为差​​异。
这是次优的方式,但如果您在项目中受阻,它可能会帮助您等待编译器补丁。

查看我对此 post 的回答:

#include <string>

template <class>
struct Foo {
    template <class T>
    struct Bar {
        Bar(T) { }
    };
    #if __clang__
    Bar(char const*) -> Bar<std::string>;
    #endif
};

void instanciate_symbols()
{
    [[maybe_unused]] auto bar = Foo<int>::Bar{"abc"};
}