Pat*_*ski 11 c++ tuples template-meta-programming
使用此在线编译器构建,代码如下:
#include <iostream>
#include <type_traits>
#include <tuple>
int main() {
std::cout << std::is_trivially_copyable<std::tuple<int>>::value << std::endl;
std::cout << std::is_trivially_copyable<std::pair<int, int>>::value << std::endl;
std::cout << std::is_trivial<std::tuple<int>>::value << std::endl;
std::cout << std::is_trivial<std::pair<int, int>>::value << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
0
0
0
Run Code Online (Sandbox Code Playgroud)
我在Visual Studio 2015中获得了相同的结果.
为什么会这样?是否存在std::tuplePOD类型的正当理由,更不用说简单的std::pair,不能轻易复制?我假设它们的实现提供了一些自定义赋值运算符,但它们与编译器生成的默认版本有何不同?
Nic*_*las 11
该车次的事情pair就微不足道复制性而言起来的是标准不要求的复制/移动赋值运算符是微不足道的.该标准明确声明复制/移动构造函数是默认的,但对于赋值则不然.实现也可以默认它们,但标准不要求它.
标准不需要它没有很好的理由.但事实并非如此.
对于tuple,事情很多更复杂.许多tuple实现基于具有正确大小/对齐的存储缓冲区,并使用放置new来构造该缓冲区内的各个成员.这一切都很好,但是这种类型必须实现手动复制/移动构造函数,因为它必须调用每种类型的复制/移动构造函数.即使它知道它们都是可以轻易复制并通过复制它们memcpy,这仍然是一个手动操作.这使得它不具备琐碎的可复制性.
现在,tuple如果类型可以轻易复制,那么有些实现可以轻易地复制.但是没有要求以这种方式实现它们.tuple如果所有类型都可以轻易地复制,那么它会使实现非常复杂,要求它们以一种方式实现它们,否则以不同的方式实现它们.
因为std::tuple有复制/移动ctor和赋值运算符,所以它使得该类非常简单 - 可复制.
参见cpp参考:
一个简单的可复制类是一个类
Run Code Online (Sandbox Code Playgroud)Has no non-trivial copy constructors (this also requires no virtual functions or virtual bases) Has no non-trivial move constructors Has no non-trivial copy assignment operators Has no non-trivial move assignment operators Has a trivial destructor
但是std::tuple具有上述所有构造函数和赋值运算符.
| 归档时间: |
|
| 查看次数: |
1493 次 |
| 最近记录: |