Tôi gặp vấn đề rất lạ với các mẫu variadic. Có vẻ như gói sai được mở rộng. Dưới đây là một đoạn mã:Gói sai mở rộng trong mẫu variadic
#include <tuple>
template<typename...>
struct types {};
template<typename = types<>>
struct Base;
template<typename... Args1>
struct Base<types<Args1...>> {
template<typename... Args2>
static auto construct(Args1... args1, Args2&&... args2)
-> decltype(std::make_tuple(args1.forward()..., std::declval<Args2>()...))
{
return std::make_tuple(args1.forward()..., std::forward<Args2>(args2)...);
}
};
struct Derived : Base<> {};
int main() {
auto test = &Derived::construct<char const(&)[7]>;
}
tôi nhận được lỗi này:
13 : <source>:13:43: error: request for member 'forward' in 'args2#0', which is of non-class type 'const char [7]'
-> decltype(std::make_tuple(args1.forward()..., std::declval<Args2>()...))
~~~~~~^~~~~~~
13 : <source>:13:43: error: request for member 'forward' in 'args2#0', which is of non-class type 'const char [7]'
<source>: In function 'int main()':
22 : <source>:22:27: error: unable to deduce 'auto' from '& construct<const char (&)[7]>'
auto test = &Derived::construct<char const(&)[7]>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~
22 : <source>:22:27: note: could not resolve address from overloaded function '& construct<const char (&)[7]>'
Compiler exited with result code 1
Tuy nhiên, nó không xảy ra khi các gói có giá trị trong nó:
struct HasForward { int forward() { return 0; } };
struct Derived : Base<types<HasForward>> {};
Đây là First snippet live và Second snippet live
Có gì sai với mã này? Đây có phải là lỗi trình biên dịch không? Có cách nào để vượt qua nó và để gói đầu tiên trống không?
kêu vang My ++ biên dịch mà không có vấn đề; Tôi cho rằng đó là lỗi g ++. – max66