考虑以下代码:
#include <iostream>
template <class... T>
struct structure
{
template <class... Args>
constexpr structure(Args&&...) noexcept {
std::cout << "structure<T...>" << std::endl;
}
};
template <class... T>
struct structure<void, T...>
{
template <class... Args>
constexpr structure(Args&&...) noexcept {
std::cout << "structure<void, T...>" << std::endl;
}
};
template <class... Args>
structure(Args&&...) -> structure<void, Args...>;
int main(int argc, char* argv[])
{
structure<int> s1(42);
structure s2(42);
return 0;
}
它产生以下输出:
structure<T...>
structure<T...>
而我本来期望的:
structure<T...>
structure<void, T...>
在这种情况下,为什么推导指南失败了?或至少没有按我预期的那样工作。