从使用概念定义的函数返回新对象
Returning new object from function defined using Concepts
Code
#include <type_traits>
template <typename N>
concept Number = std::is_arithmetic<N>::value;
template <typename T>
concept VectorXY = requires(T t)
{
{t.x} -> Number;
{t.y} -> Number;
};
template <Number N>
struct Vec2
{
N x = 0;
N y = 0;
};
VectorXY operator*(VectorXY v, Number n)
{
return {v.x * n, v.y * n};
// error: returning initializer list
}
int main()
{
Vec2<float> v = Vec2<float>{} * 1;
// error: conversion from 'void' to non-scalar type 'Vec2<float>' requested
}
神霹雳:https://godbolt.org/z/gYsQ5B
那么我该如何解决这个问题呢?
解释为什么编译器无法推断返回类型也会有所帮助。
VectorXY
不是一种类型。这是一个概念,旨在检查从函数返回的表达式推导出的类型。并且所述类型推导与推导函数参数的类型完全分开。
您返回的是
{v.x * n, v.y * n}
它是一个支撑封闭的初始值设定项。在对它进行模板参数推导时,通常推导出的是一个std::initializer_list
。这样做的两个问题是,首先,不包括相应的标头,因此程序格式不正确。其次,即使包含标题,std::initializer_list<float>
也不能满足VectorXY
概念。
您可以通过指定返回对象的类型来修复它,例如通过函数强制转换表示法
return decltype(v){v.x * n, v.y * n};
现在它是一个类型化表达式,根据该表达式,函数的返回类型被推导出为满足VectorXY
概念的东西。
活生生的例子。
作为附录,GCC 尚未实现它,但正确的语法应该是
VectorXY auto operator*(VectorXY auto v, Number auto n)
{
return decltype(v){v.x * n, v.y * n};
}
鉴于仅使用VectorXY
引起的混乱,我认为委员会要求这种受约束的auto
语法是正确的。在这里,正在进行类型推断的事实对我来说更为明显。
相关文章:
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 重用对象与创建新对象
- C++,创建新对象时类的对象更改
- 运算符重载 += 添加新对象
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 从使用概念定义的函数返回新对象
- 从 Rcpp 函数返回指向"新"对象的指针的正确方法
- 有没有一种方法可以从函数中返回一个新对象或对现有对象的引用
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 初始化对象时,可以丢弃新的返回值吗?
- 按值返回不会创建一个新对象
- 如何从NanAsyncWorker返回一个新对象
- 如何实现一个创建新对象并返回对它的引用的C++方法
- 返回新对象的函数与将函数的结果分配给调用它的对象的 C++ 区别
- 如何控制将返回对象复制到新对象中
- C++:当在函数内部创建新对象并将其作为结果返回时,我必须使用新运算符来创建对象
- 将新对象添加到向量中,每次都返回相同的地址
- 它是否返回新对象