struct MyClass
{
operator const char* ()
{
return "hello";
}
};
int main()
{
MyClass obj;
std::cout << obj; // ok
printf("%s\n", obj); // Crash
}
为什么带有operator const char*
的对象无法自动转换为const char* string
中的printf
以映射%s
?
是否只是因为类似printf的函数没有类型感知而且%s
只期望一个带有终端0的char数组?
答案 0 :(得分:5)
为什么呢?由于C ++中可变参数的限制:它们基本上没有类型,您可以将它们视为void *
(但它们不是)。
所以知道,编译器不知道你认为应该是一个字符串。它很可能需要是整数,双精度或其他对象。或者仅仅是编译器选择的本身。
答案 1 :(得分:2)
当您使用:
致电browsers : ['Chrome'],
plugins : [
'karma-chrome-launcher',
'karma-jasmine'
]
时
printf
编译器不使用自动转换功能将printf("%s\n", obj);
转换为obj
。 char const*
按值传递到obj
,printf
会尝试将该值视为printf
。因此,您的程序显示未定义的行为。您必须明确地将char const*
投射到obj
,以使您的程序可预测。
char const*
如果您在编译器中打开警告级别,您可能会看到一些内容,表明在printf("%s\n", (char const*)obj);
调用中使用obj
是不正确的。使用printf
,我得到:
g++ -Wall