使用示例中的C++ std::is_trivially_move_constructible
C++ STL中的 std::is_trivially_move_constructible 模板出现在 < type_traits>头文件中。C++ STL的 std::is_trivially_move_constructible 模板用于检查 T 是否是可平凡移动构造的。如果 T 是可平凡移动构造类型,则返回布尔值true,否则返回false。
头文件:
#include<type_traits>
模板类:
template< class T >
struct is_trivially_move_constructible;
语法:
std::is_trivially_move_constructible<T>::value
参数: 模板 std::is_trivially_move_constructible 接受单个参数 T(特征类) ,以检查 T 是否是可平凡移动构造类型。
返回值: 模板 std::is_trivially_move_constructible 返回布尔变量,如下所示:
- 真: 如果类型 T 是可平凡移动构造的,则返回true。
- 假: 如果类型 T 不是可平凡移动构造的,则返回false。
下面的程序演示了如何在C++中使用 std::is_trivially_move_constructible :
程序1:
// C++ program to demonstrate
// std::is_trivially_move_constructible
#include <iostream>
#include <type_traits>
using namespace std;
// Declaration of classes
class A {
};
class B {
B() {}
};
enum class C : int { x,
y,
z };
class D {
int v1;
double v2;
public:
D(int n)
: v1(n), v2()
{
}
D(int n, double f)
noexcept : v1(n), v2(f) {}
};
int main()
{
cout << boolalpha;
// Check if int is trivially
// move constructible or not
cout << "int: "
<< is_trivially_move_constructible<int>::value
<< endl;
// Check if class A is trivially
// move constructible or not
cout << "class A: "
<< is_trivially_move_constructible<A>::value
<< endl;
// Check if class B is trivially
// move constructible or not
cout << "class B: "
<< is_trivially_move_constructible<B>::value
<< endl;
// Check if enum class C is trivially
// move constructible or not
cout << "enum class C: "
<< is_trivially_move_constructible<C>::value
<< endl;
// Check if class D is trivially
// move constructible or not
std::cout << "class D: "
<< is_trivially_move_constructible<D>::value
<< endl;
return 0;
}
int: true
classA: true
class B: true
enum class C: true
class D: true
程序2:
// C++程序演示
// std::is_trivially_move_constructible
#include <iostream>
#include <type_traits>
using namespace std;
// 声明结构体
struct Ex1 {
Ex1() {}
Ex1(Ex1&&)
{
cout << "抛出移动构造函数!";
}
Ex1(const Ex1&)
{
cout << "抛出复制构造函数!";
}
};
struct Ex2 {
Ex2() {}
Ex2(Ex2&&) noexcept
{
cout << "不抛出移动构造函数!";
}
Ex2(const Ex2&) noexcept
{
cout << "不抛出复制构造函数!";
}
};
// 主函数
int main()
{
cout << boolalpha;
// 检查结构体Ex1是否可以移动构造
cout << "Ex1是否可以移动构造?"
<< is_move_constructible<Ex1>::value
<< '\n';
// 检查结构体Ex1是否是平凡移动构造的
cout << "Ex1是否是平凡移动构造的?"
<< is_trivially_move_constructible<Ex1>::value
<< '\n';
// 检查结构体Ex2是否是平凡移动构造的
cout << "Ex2是否是平凡移动构造的?"
<< is_trivially_move_constructible<Ex2>::value
<< '\n';
}
Ex1是否可以移动构造?true
Ex1是否是平凡移动构造的?false
Ex2是否是平凡移动构造的?false