我正在尝试使以下函数SFINAE友好:
#include <utility>
template <typename T, typename ...P>
T foo(P &&... params)
{
return {std::forward<P>(params)...};
}
我不能将return
语句放在SFINAE上下文中,但由于这是复制列表初始化的一个示例,我想我可以找到一个不同的可以使用SFINAE的示例。
有T({...})
,但只有GCC接受它:
template <typename T, typename ...P>
T foo(P &&... params)
requires requires{T({std::forward<P>(params)...});}
{
return {std::forward<P>(params)...};
}
#include <array>
struct A
{
A(int) {}
A(const A &) = delete;
A &operator=(const A &) = delete;
};
int main()
{
foo<std::array<A, 3>>(1, 2, 3); // Error: call to implicitly-deleted copy constructor of `std::array`.
}
还有foo({...})
(一个函数调用(。GCC和Clang接受,但MSVC拒绝:
template <typename T>
void accept(T) noexcept;
template <typename T, typename ...P>
T foo(P &&... params)
requires requires{accept<T>({std::forward<P>(params)...});}
{
return {std::forward<P>(params)...};
}
我如何解决编译器错误,并以可移植的方式编写这个SFINAE?
如果在accept
:中使用const&
参数,则第二个版本有效
template <typename T>
void accept(const T&) noexcept;