编译器警告(等级 4)C4256

“function”:带虚拟基的类的构造函数具有“...”;调用可能与 Visual C++ 的早期版本不兼容

可能的不兼容。

请考虑以下代码示例。 如果构造函数 S2::S2( int i, ... ) 的定义是使用低于 Microsoft C++ 版本 7 的版本编译的,但下面的示例是使用当前版本编译的,则由于特殊情况的调用约定发生更改,对 S3 的构造函数的调用将无法正常工作。 如果两者都是使用 Visual C++ 6.0 编译的,该调用也无法完全正常工作,除非不为省略号传递任何参数。

若要修复此警告,

  1. 请勿在构造函数中使用省略号。

  2. 确保项目中的所有组件都是使用当前版本生成的(包括可能定义或引用此类的任何库),然后使用 warning pragma 禁用警告。

下面的示例生成 C4256:

// C4256.cpp
// compile with: /W4
// #pragma warning(disable : 4256)
struct S1
{
};

struct S2: virtual public S1
{
   S2( int i, ... )    // C4256
   {
      i = 0;
   }
   /*
   // try the following line instead
   S2( int i)
   {
      i = 0;
   }
   */
};

void func1()
{
   S2 S3( 2, 1, 2 );   // C4256
   // try the following line instead
   // S2 S3( 2 );
}

int main()
{
}