www_adintr_com 2016年06月21日
加精
是 VC2015 的 BUG 还是 C++ 的什么特性?
1.

#include <cstdio>
#include <type_traits>
#include <typeinfo>
#include <vector>

class AA
{
public:
template <typename ImpInterface>
AA(ImpInterface&& impobj)
{
printf("construct use type %s\n", typeid(impobj).name());
}

private:
};



void test_language()
{
std::vector<AA> a{ AA(10) };
}


Debug 版, 关闭优化的情况下, 输出:
construct use type int
后正常结束, 没看到 拷贝构造 的调用.

2.

#include <cstdio>
#include <type_traits>
#include <typeinfo>
#include <vector>

class AA
{
public:
AA(const AA& a) {};

template <typename ImpInterface>
AA(ImpInterface&& impobj)
{
printf("construct use type %s\n", typeid(impobj).name());
}

private:
};

void test_language()
{
std::vector<AA> a{ AA(10) };
}


输出
construct use type int
construct use type class AA
后崩溃.
在提供了拷贝构造函数的情况下, 却没用使用提供的那一份, 而是选用了模板那一份,执行完后竟然还崩溃了...


3.

#include <cstdio>
#include <type_traits>
#include <typeinfo>
#include <vector>

class AA
{
public:
AA(const AA& a) = default;

template <typename ImpInterface>
AA(ImpInterface&& impobj)
{
printf("construct use type %s\n", typeid(impobj).name());
}

private:
};

void test_language()
{
std::vector<AA> a{ AA(10) };
}


输出
construct use type int
construct use type class AA
后正常结束, 没有崩溃了.

4.

#include <cstdio>
#include <type_traits>
#include <typeinfo>
#include <vector>

class AA
{
public:
AA(const AA& a) = delete;

template <typename ImpInterface>
AA(ImpInterface&& impobj)
{
printf("construct use type %s\n", typeid(impobj).name());
}

private:
};

void test_language()
{
std::vector<AA> a{ AA(10) };
}


编译报错: error C2280: 'AA::AA(const AA &)': attempting to reference a deleted function

5.

#include <cstdio>
#include <type_traits>
#include <typeinfo>
#include <vector>

class AA
{
public:
AA(AA&& a) {};

template <typename ImpInterface>
AA(ImpInterface&& impobj)
{
printf("construct use type %s\n", typeid(impobj).name());
}

private:
};

void test_language()
{
std::vector<AA> a{ AA(10) };
}


编译报错:
error C2280: 'AA::AA(const AA &)': attempting to reference a deleted function

----------------------------------------------------------------------------------------------------------
在有 template <typename ImpInterface> AA(ImpInterface&& impobj) 这种右值引用的模板构造函数的情况下, 到底需要怎么样定义自己的拷贝构造函数呢?
...全文
4571 点赞 收藏 60
写回复
60 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告