[英]Template functions: default construction without copy-constructing in C++
考虑到
struct C {
C() { printf("C::C()\n" ); }
C(int) { printf("C::C(int)\n" ); }
C( const C& ) { printf("copy-constructed\n"); }
};
和模板功能
template< typename T > void foo(){
// default-construct a temporary variable of type T
// this is what the question is about.
T t1; // will be uninitialized for e.g. int, float, ...
T t2 = T(); // will call default constructor, then copy constructor... :(
T t3(); // deception: this is a local function declaration :(
}
int main(){
foo<int>();
foo<C >();
}
查看t1
,当T
为例如int
时,它不会被初始化。 另一方面, t2
将从默认构造的临时复制构造。
问题是:在C ++中是否可以默认构造一个通用变量,而不是使用template-fu?
这是一个你可以使用的技巧,使用本地类:
template <typename T> void foo() {
struct THolder {
T obj;
THolder() : obj() { } // value-initialize obj
};
THolder t1; // t1.obj is value-initialized
}
我想我从另一个Stack Overflow问题的答案中读到了这个技巧,但我现在无法找到这个问题。
或者,您可以使用boost::value_initialized<T>
类模板,它基本上做同样的事情,具有更大的灵活性和一致性,并为错误的编译器提供了变通方法。
在C ++ 0x中,它更容易:您可以使用空的初始化列表:
T obj{}; // obj is value-initialized
(据我所知,只有gcc 4.5+支持C ++ 0x初始化列表.Clang和Visual C ++还不支持它们。)
如果您不关心复制构造函数必须存在的事实,并且只是想阻止它被调用:
别担心:它不会。 在这种情况下, 将省略复制构造函数调用。 始终,可靠 - 即使在禁用优化 ( -O0
)的情况下编译也是如此 。
你真正的问题是什么? 为t1实例调用默认构造函数。
T t2 = T(); //将调用默认构造函数,然后复制构造函数...... :(
不在我的编译器(VC2008)上。 我的输出是......
C::C()
C::C()
这是我期望它做的。 我错过了什么吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.