有没有办法禁止在c样式变量参数列表中使用值?

在c样式无类型变量参数列表中使用类的常规使用是一种常见的错误源。 例:

class MyString { public: char *pChars; int Length; MyString(char *pChars) { this->pChars = pChars; Length = strlen(pChars); } }; int main() { MyString s1("Bla1"), s2("Bla2"); printf("%s%s", s1, s2); // This does not but should give a compiler warning/error! return 0; } 

printf调用按值接收两个s对象。 这意味着他们的所有成员都只是简单的内存复制。 但它们被解释为一个简单的char指针。 结果当然是运行时错误。

我不是要求解决这个问题,但是我希望有一些东西可以添加到我的类中,以便编译器向我发出警告或给出错误。

已经尝试声明但没有实现复制构造函数。 但似乎没有调用复制构造函数。 🙁

请回答标题中的问题。 我不需要讨论为什么你不应该使用printf或这些变量参数列表 – 知道这一点。

谢谢你的时间。

体面编译器(如gcc)检查printf参数是否与格式字符串中的格式说明符匹配。

只是不要忘记添加-Wformat-Wall命令行选项。

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

从boost :: noncopyable派生

隐藏复制构造函数和赋值运算符(将它们声明为私有,无需实现它们)。 或者从boost :: noncopyable派生类(具有相同的效果)。按值分配参数决定了拷贝构造函数的用法。