如何在返回语句中以可移植的方式为复制列表init编写SFINAE
How do I write SFINAE for copy-list-init in a return statement, in a portable way?
我正在尝试使以下函数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;
相关文章:
- 复制部分文件的C++/增强方式
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- 以最佳方式返回复制的值
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- 矩阵类编写构造函数,解构器和复制构造函数的方式
- 指针将其复制到另一个指针时的工作方式
- 复制到Texture2D和从Texture2D复制的最快捷方式
- 复制QMimeData对象的正确方式
- 由于您可以在C 中以两种方式声明复制构造函数,这是正确的方式
- 可执行文件在被复制时以某种方式损坏
- 将剪切、复制、粘贴快捷方式更改为Qt 5中的自定义槽
- 将C++缓冲区复制到Python的最佳方式
- 我需要以相反的方式复制一个长整型数组,我需要系统函数,例如 memcpy 有没有
- 复制构造函数快捷方式
- 以理智、安全和高效的方式复制文件
- 将子字符串从char*复制到std::string的优雅方式
- 以迭代方式复制二叉树
- 为什么派生类中复制/移动函数"normal"实现的行为会有所不同,具体取决于它们的定义方式?
- 复制构造函数未被调用,无法理解赋值运算符的工作方式
- 通过转换将C++向量复制到另一个向量的最佳方式