【发布时间】:2019-10-23 02:14:37
【问题描述】:
我有一个类 SpecialString。它有一个运算符重载/转换函数,它在任何时候都使用它作为 const char* 传递。然后它返回一个正常的 c 字符串。
class SpecialString
{
...
operator char* () const { return mCStr; }
...
};
当我将这些直接传递给 printf() 时,这在很久以前(字面意思是 19 年前)曾经有效。编译器足够聪明,知道参数应该是 char* 并且它使用了转换函数,但现在 g++ 抱怨。
SpecialString str1("Hello"), str2("World");
printf("%s %s\n", str1, str2);
错误:无法通过可变参数方法传递非 POD 类型“SPECIALSTRING”(又名“SpecialString”)的对象;调用将在运行时中止 [-Wnon-pod-varargs]
有什么方法可以在不更改代码的情况下让它再次工作?我可以添加一个 deref 运算符重载函数,该函数返回 c 字符串并像这样传递 SpecialString 对象。
class SpecialString
{
...
operator CHAR* () const { return mCStr; }
char* operator * () const { return mCStr; }
...
};
SpecialString str1("Hello"), str2("World");
printf("%s %s\n", *str1, *str2);
但我不希望这样做,因为这需要手动更改数千行代码。
【问题讨论】:
-
我几乎可以向您保证,“编译器足够聪明,知道参数是 char* 并且它使用了转换函数”是对编译器所做工作的误解。跨度>
-
您是否尝试使用选项
-Wnon-pod-varargs编译它? -
这从未正式生效。你逃脱了一些未定义的行为。有时你会这样做。有时你不会。
-
@Havenard,将错误的类型传递给
printf是UB。 -
@Havenard 他们正在传递
SpecialString类型的左值。那是错误的类型。
标签: c++ function methods variadic