为什么这个 return 类型有效?
Why is this return type valid?
我正在看这个 raytracer 的源代码。在名为 algebra3.cpp
的文件的第 145 行,我们可以看到这个函数:
inline vec2 operator * (const mat3& a, const vec2& v) {
vec3 av;
av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ];
av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ];
av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ];
return av;
}
它应该 return 一个 vec2
对象而不是 return 一个 vec3
。这是为什么?
如果 vec3
可以隐式转换为 vec2
,那么就编译器所知,该函数是正确的。
计算完就扔掉av.n[VZ]
似乎很愚蠢。如果那是程序所做的,那么我猜这可能是程序员的错误。
如果没有关于该函数应该做什么的更多信息,就不可能判断它实际上是否应该 return 一个 vec3
,或者额外的计算是否只是遗留下来的死代码和temporary 的类型应该是 vec2
。或者当前代码是否正是程序员想要的。
我正在看这个 raytracer 的源代码。在名为 algebra3.cpp
的文件的第 145 行,我们可以看到这个函数:
inline vec2 operator * (const mat3& a, const vec2& v) {
vec3 av;
av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ];
av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ];
av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ];
return av;
}
它应该 return 一个 vec2
对象而不是 return 一个 vec3
。这是为什么?
如果 vec3
可以隐式转换为 vec2
,那么就编译器所知,该函数是正确的。
计算完就扔掉av.n[VZ]
似乎很愚蠢。如果那是程序所做的,那么我猜这可能是程序员的错误。
如果没有关于该函数应该做什么的更多信息,就不可能判断它实际上是否应该 return 一个 vec3
,或者额外的计算是否只是遗留下来的死代码和temporary 的类型应该是 vec2
。或者当前代码是否正是程序员想要的。