【发布时间】:2020-07-12 20:02:14
【问题描述】:
我有以下代码,在我看来,它不应该编译:
(class Vector(不是std::vector,而是我自己定义的Vector):
Vector operator*(double factor)
{
// some element-wise multiplication here
return factor;
}
我将这个运算符定义为返回一个Vector,但在方法内部我返回一个double。
我还没有在类中定义了任何隐式转换运算符。
我认为这显然是无效的,但 gcc 很高兴地编译了它,完全没有任何抱怨。
我的第一个反应是向 gcc 提交缺陷报告,但我想我会在此之前问...
我是否遗漏了一些可以解释为什么编译器认为此代码有效的内容?
(如果相关,c++-standard 设置为 c++17)
关于Vector 类的更多信息:(即,我包括所有声明的构造函数和运算符,因为其他命名函数不应导致此问题):
class Vector {
public:
Vector(std::vector<double> values);
Vector(size_t dimension, double value);
Vector(size_t dimension);
void operator*=(double factor);
void operator*=(Vector const& factor);
friend Vector operator-(Vector const& a, Vector const& b);
friend Vector operator+(Vector const& a, Vector const& b);
friend Vector operator*(Vector const& a, Vector const& b);
Vector operator*(double factor);
double& operator[](size_t i);
friend std::ostream& operator<<(std::ostream& stream, Vector const& v);
}
【问题讨论】:
-
没有看到
Vector的定义很难说代码是否有效。 -
否 minimal reproducible example - 没有发生
-
猜测
Vector有一个非显式的单参数构造函数,它接受一个数值,例如:godbolt.org/z/EcTvGo -
“我的第一反应是向 gcc 提交缺陷报告”,这应该是你最后的反应。
-
您应该将一个构造函数更改为
explicit Vector(size_t dimension);。
标签: c++ gcc operator-overloading implicit-conversion