gpt4 book ai didi

c++ - 使用 Detected Idiom 实现 is_destructible

转载 作者:太空狗 更新时间:2023-10-29 21:10:36 27 4
gpt4 key购买 nike

这是我对 is_destructible_v 的实现:

template<class T>
struct is_unknown_bound_array : std::false_type
{};
template<class T>
struct is_unknown_bound_array<T[]> : std::true_type
{};

template<typename T, typename U = std::remove_all_extents_t<T>>
using has_dtor = decltype(std::declval<U&>().~U());

template<typename T>
constexpr bool is_destructible_v
= (std::experimental::is_detected_v<has_dtor, T> or std::is_reference_v<T>)
and not is_unknown_bound_array<T>::value
and not std::is_function_v<T>;

template<typename T>
struct is_destructible : std::bool_constant<is_destructible_v<T>>
{};

clang compiled happily and passed all libstdcxx's testsuite , 而 gcc failed to compile :

prog.cc:177:47: error: 'std::declval<int&>()' is not of type 'int&'

177 | using has_dtor = decltype(std::declval<U&>().~U());
| ~~~~~~~~~~~~~~~~~~~~^
prog.cc: In substitution of 'template<class T, class U> using has_dtor = decltype (declval<U&>().~ U()) [with T = int&&; U = int&&]':

因此,gcc 无法在 using has_dtor = decltype(std::declval<U&>().~U()); 上执行 SFINAE .

问题:

  1. 哪个编译器反对这里的标准?
  2. 这里最优雅的解决方案/解决方法是什么?我能想到的方式有点丑

最佳答案

GCC 在处理 ~T() 时似乎被破坏了,其中 T 是标量类型的引用。

它接受 following code ,根据 [expr.pseudo]/2 这显然是错误的:

template<typename T> using tester = decltype(int{}.~T(), char{});
tester<int&> ch;
int main() {}

我会使用 if constexpr 来实现:

template<class T>
constexpr bool my_is_destructible() {
if constexpr (std::is_reference_v<T>) {
return true;
} else if constexpr (std::is_same_v<std::remove_cv_t<T>, void>
|| std::is_function_v<T>
|| is_unknown_bound_array<T>::value ) {
return false;
} else if constexpr (std::is_object_v<T>) {
return std::experimental::is_detected_v<has_dtor, T>;
} else {
return false;
}
}

works也有 GCC。

关于c++ - 使用 Detected Idiom 实现 is_destructible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53456848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com