我已阅读std::is_nothrow_copy_constructible,并了解我们可以使用此函数检查复制构造函数是否抛出。我写了一些演示如下:
#include <iostream>
struct A { };
struct B { B(const B&){} };
struct C { C(const C&) noexcept {} };
struct D { int a;};
struct E { std::string a;};
struct F { F(const F&)= default; };
struct G { std::string a; G(const G&)= default; };
int main() {
std::cout << std::boolalpha;
std::cout << "is_nothrow_copy_constructible:" << std::endl;
std::cout << "int: " << std::is_nothrow_copy_constructible<int>::value << std::endl;
std::cout << "A: " << std::is_nothrow_copy_constructible<A>::value << std::endl;
std::cout << "B: " << std::is_nothrow_copy_constructible<B>::value << std::endl;
std::cout << "C: " << std::is_nothrow_copy_constructible<C>::value << std::endl;
std::cout << "D: " << std::is_nothrow_copy_constructible<D>::value << std::endl;
std::cout << "E: " << std::is_nothrow_copy_constructible<E>::value << std::endl;
std::cout << "F: " << std::is_nothrow_copy_constructible<F>::value << std::endl;
std::cout << "G: " << std::is_nothrow_copy_constructible<G>::value << std::endl;
return 0;
}
结果是:
is_nothrow_copy_constructible:
int: true
A: true
B: false
C: true
D: true
E: false
F: true
G: false
我想知道E为什么扔,但d不是。我想:
我不知道我的猜测是否真实。 Ant我想知道在哪里可以找到std::is_nothrow_copy_constructible
的实现?
答案 0 :(得分:1)
让我们看一下标准库的stdlibc ++实现(可以在<type_traits>
中找到):
template<typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
: public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))>
{ };
template<typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
: public integral_constant<bool,
noexcept(static_cast<_Tp>(declval<_Arg>()))>
{ };
实现只检查对(copy-)构造函数的调用是noexcept
(使用noexcept
operator)并从true_type
或false_type
继承相应的内容。您的假设是正确的,编译器足够聪明,只要有可能就使默认构造函数noexcept,即,它不必调用未标记为noexcept
的成员对象的构造函数。