有人知道为什么C++在可变参数printf函数上失败吗?代码是可修复的吗?这只是一个简单的例子,但一般情况对我来说很重要。
#include <stdio.h>
#include <iostream>
using namespace std;
class Float32 {
public:
float & operator = (const float &newValue) {
return value = newValue;
}
operator float () const {
return value;
}
protected:
float value;
};
int main() {
Float32 value;
value = 0.5;
cout << "cout value: " << value << endl; // this works
printf("something fishy about varargs or something...n");
printf("printf value: %f", value); // fails (outputs random garbage value)
}
如果这是一个编译器错误/问题,我正在使用Visual Studio 2017。
如果这是一个编译器错误/问题,我正在使用Visual Studio 2017。
不,没有编译器错误。一切都按预期工作。
有谁知道为什么C++在可变参数 printf 函数上失败?
printf("printf value: %f", value);
不会隐式调用转换运算符,而是严格期望float
值,而不是Float32
实例。
它不能这样做,因为%f
是在运行时解析的,printf()
不可能知道你的类在那个时候有一个转换运算符。
代码是可修复的吗?
你仍然必须明确地进行强制转换:
printf("printf value: %f", (float)value);
由于template<typename T> std::ostream& operator<<(std::ostream, const T&)
是一个模板函数,它将在编译时推断出最佳转换,这将相反。