C++ C++;使用模板成员初始化,该模板成员使用任意模板参数构造模板成员

C++ C++;使用模板成员初始化,该模板成员使用任意模板参数构造模板成员,c++,c++11,templates,C++,C++11,Templates,我不知道为什么下面的代码块可以编译并工作,即使模板语法所隐含的语义是不同的。类A接受模板类型Data,并包含模板类型Data的成员Data。它还有一个构造函数,该构造函数通过值接受数据的实例,并使用假定的复制构造函数实例化成员数据。另一个类C有一个任意构造函数,它获取指向某个任意类B的指针,并将其存储为成员foo。当A中的数据被模板化为C类型,并且A实例化为C的构造函数接受的参数时(即,指向AB的指针)由于a未被告知如何处理任意参数并将其传递给数据构造函数,因此可能会出现编译器错误。它只被告知对

我不知道为什么下面的代码块可以编译并工作,即使模板语法所隐含的语义是不同的。类
A
接受模板类型
Data
,并包含模板类型
Data
的成员
Data
。它还有一个构造函数,该构造函数通过值接受
数据的实例,并使用假定的复制构造函数实例化成员
数据。另一个类
C
有一个任意构造函数,它获取指向某个任意类
B
的指针,并将其存储为成员
foo
。当
A
中的
数据
被模板化为
C
类型,并且
A
实例化为
C
的构造函数接受的参数时(即,指向A
B
的指针)由于
a
未被告知如何处理任意参数并将其传递给
数据
构造函数,因此可能会出现编译器错误。它只被告知对现有实例使用
Data
的复制构造函数。但是,这段代码使用clang和c++11编译并打印为true。我想这是一个编译器错误,不是一个特性,但是我可能忽略了C++模板是如何工作的。我还对该功能的正确语法感到好奇,(将任意模板参数传递给
A
的构造函数,并将它们转发给
数据类型的构造函数),因为这是我的实际意图

#包括
模板
结构A{
数据;
A(数据):数据(数据){
};
结构B{
B(){}
};
结构C{
B*foo;
C(B*foo_uu):foo(foo_uu){
};
int main(){
B foo;
A事物=A(&foo);

std::cout代码编译的原因是
struct C
的构造函数未标记为显式。实际上,
A
对象在其构造函数中需要一个
C
对象。但您提供了指向b的指针。由于没有一个单参数构造函数标记为显式,因此编译器可以合法地选择从输入参数到所需参数的适当转换

通常,静态代码分析器会将此标记为不需要的,因为您永远不希望自动或意外地进行此类转换。因此,您确实应该使用explicit关键字标记所有单参数构造函数


代码编译的原因是
struct C
的构造函数未标记为显式。实际上,
A
对象在其构造函数中需要一个
C
对象。但您提供了指向b的指针。由于没有一个单参数构造函数标记为显式,因此编译器选择从输入参数到所需参数的适当转换

通常,静态代码分析器会将此标记为不需要的,因为您永远不希望自动或意外地进行此类转换。因此,您确实应该使用explicit关键字标记所有单参数构造函数


如果你制作了
A
而不是一个模板,同样的事情也会发生。这是一个隐式转换Interesting,只是尝试了一下,你是完全正确的。我觉得很奇怪,有关于此功能的文档吗?这不是最容易阅读的,但非常准确。@Justin请将其扩展为一个答案。否则,我们只有老鼠的拙劣尝试。如果你制作了
a
而不是模板,同样的事情也会发生。这是一个隐式转换interest,只是尝试了一下,你完全正确。我觉得很奇怪。有关于这个功能的文档吗?这不是最容易阅读的,但非常准确。@Justin请解释一下否则,我们只有老鼠的拙劣尝试。