【发布时间】:2021-04-27 19:25:17
【问题描述】:
我在玩 c++20 概念
https://godbolt.org/z/931xaeY45
#include <type_traits>
template<typename T>
class Optional
{
public:
~Optional() requires (!std::is_trivially_destructible_v<T>);
};
#include <cstdio>
int main()
{
const char* bool_value[] = {"false", "true"};
bool is_trivial = std::is_trivial_v<Optional<int>>;
bool is_trivial_destructable = std::is_trivially_destructible_v<Optional<int>>;
std::printf("std::is_trivial_v<Optional<int>> = %s\n", bool_value[is_trivial]);
std::printf("std::is_trivial_destructable<Optional<int>> = %s\n", bool_value[is_trivial_destructable]);
}
输出:
std::is_trivial_v<Optional<int>> = false
std::is_trivial_destructable<Optional<int>> = false
但是,我希望析构函数不会被实例化,因为在这种情况下,requires (false) 是为模板参数int 生成的。
问:为什么~Optional() requires (false) 让Optional 类变得不平凡?
【问题讨论】:
标签: c++ language-lawyer c++20 typetraits c++-concepts