如何提供嵌套模板推导指南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 提交)。
如果您确实需要临时快速修复,请考虑使用特定于编译器的说明。
关键是通过添加特定于编译器的指令来处理 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"};
}
根据[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 提交)。
如果您确实需要临时快速修复,请考虑使用特定于编译器的说明。
关键是通过添加特定于编译器的指令来处理 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"};
}