【问题标题】:How to test if std::remove_cvref is defined in the standard library?如何测试标准库中是否定义了 std::remove_cvref?
【发布时间】:2019-07-17 09:21:02
【问题描述】:

我在这里看不到任何类似于功能测试宏的东西: https://en.cppreference.com/w/cpp/utility/feature_test

原论文中似乎也没有提到: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0550r2.pdf

测试__cplusplus 也不合适,因为 C++20 尚未发布,但此功能可能已受支持。

功能测试宏支持是否会在标准化过程中稍后出现,或者这个添加太小而不能成为功能测试宏的一部分,因此想要有条件地使用标准版本的人必然会回到老式的手动编译器版本检查?

【问题讨论】:

  • 无论如何,您始终可以使用std::remove_cv<std::remove_reference_t<T>> 代替std::remove_cvref<T>,这样您可能会认为此功能太次要,不值得进行功能测试...

标签: c++ c++-standard-library c++20


【解决方案1】:

查看[tab:cpp.predefined.ft],我也没有看到任何可能与之相关的内容。大概是因为这个功能被认为是次要的,而且很容易自己实现:

template <typename T>
struct remove_cvref :remove_cv<remove_reference_t<T>> {};

template <typename T>
using remove_cvref_t = typename remove_cvref<T>::type;

如果您只是想编写可移植的代码,那么推出您自己的版本就足够了。如果您真的想检测此功能的可用性,您可能不得不求助于“老式手动编译器版本检查”。

【讨论】:

  • 我部分同意,但在某些情况下,看似次要的功能可能有可能被更优化地实现,例如用于特定标准库中的编译时。如果它至少可以作为更广泛检查的一部分,例如表明 C++20 中引入的所有新类型特征都已实现,那么它可能会更有帮助。
  • @Predelnik 是的,如果要广泛使用remove_cvref,这会有所不同。功能测试会很好。
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 2013-10-06
  • 2010-09-11
  • 2022-08-20
  • 2018-10-18
  • 1970-01-01
  • 2019-08-03
相关资源
最近更新 更多