例子:
namespace X{
inline namespace Y{
template<typename T>
struct A{
};
}
}
namespace X{
template<typename Z>
A(std::vector<Z>) -> A<Z>;
}
这会导致 Clang 11 中的编译错误,即“必须在与模板相同的范围内声明推导指南X::Y::A
”
与模板特化类似,演绎指南也应该在与类模板相同的语义范围内声明。那么,为什么我可以在 inline 命名空间之外专门化类模板,而对于演绎指南却不能呢?
特别是,这会导致另一个问题:
template<typename T>
struct Q{
operator std::vector<T>() {
return {};
}
};
namespace std{
template<typename T>
vector(Q<T>) -> vector<T>;
}
如果我想定义一个带有转换的类模板 std::vector
并为它声明一个推导指南,编译器会拒绝。在这种情况下(对于 libc++),我必须在namespace std::__1
.
CPP标准中是否有一些解决方案或解释?