我在Visual Studio 2017中新创建的控制台应用程序中有以下代码:
// TemplateTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
template<typename T>
class Base
{
protected:
Base(int a, int b, int c)
{
std::cout << "Base ctor\n";
}
};
template<typename T>
class Child : Base<T>
{
public:
Child() : Base<T>{ 1, 2 } // <- should not compile because of missing third argument
{
std::cout << "Child ctor\n";
}
};
int main()
{
Child<int> c;
return 0;
}
我认为这不应该编译。至少使用gcc 6.3 it doesn't 。但是使用Visual Studio,它可以编译并运行得很好,输出如下:
Child ctor
按任意键继续 。 。
为什么用Visual Studio编译?
如果我将构造函数调用与此交换,它不会编译并显示正确的错误消息:
Child() : Base<T>( 1, 2 )
Error C2661: 'Base<T>::Base': no overloaded function takes 2 arguments (21)
我使用的是Visual Studio Professional 2017版本15.5.7。