【问题标题】:Keyword typeof in c++11c++11中的关键字typeof
【发布时间】:2016-06-06 15:09:21
【问题描述】:

我知道:

  • typeof 是 gcc 扩展,不是 C++ 标准的一部分。

问题:

  1. 在 C++11 中是否已弃用 typeof 这个词?也就是说,在使用 C++11 时,是否还允许将其作为 gcc 扩展使用?
  2. 说用decltype 替换每个typeof 会产生相同的代码行为是否正确?
  3. 假设我有template<typename T> class wrapper。声明wrapper_some_field 的最佳方式是什么,它相当于:Wrapper<typeof(some_field)> wrapper_some_field

【问题讨论】:

  • 不存在的东西怎么会被弃用?
  • 我编辑解释我的意思
  • (1) 不,是的。 (2) 没有。 (3) 将decltypestd::remove... 一起使用,具体取决于typeof 相对于decltype 产生的内容。

标签: c++ c++11 typeof


【解决方案1】:

typeof 这个词在 C++11 中被弃用了吗?也就是说,在使用C++11的时候,是否还允许作为gcc扩展使用?

它没有弃用。它从未作为关键字存在。 gcc suggests 如果你使用 -std=c++** 编译,你会使用 __typeof__

decltype 替换每个typeof 是否会产生相同的代码行为?

没有。例如,给定:

int& foo();

decltype(foo())int&__typeof__(foo())int

假设我有template<typename T> class wrapper。 [...]

你可以写wrapper<std::remove_reference_t<decltype(some_field)>> wrap{some_field},但是写一个构造函数模板会更简洁:

template <class T> wrapper<T> make_wrapper(T const& val) { return {val}; }
auto wrap = make_wrapper(some_field);

或者,通过转发:

template <class T>
wrapper<std::decay_t<T>> make_wrapper(T&& val) {
    return {std::forward<T>(val)};
}

虽然在 C++17 中你根本不会这样做,只会使用类模板参数推导:

template <class T> struct wrapper { T t; };
template <class T> wrapper(T) -> wrapper<T>;
auto wrap = wrapper{42}; // wrap is a wrapper<int>

而在 C++20 中,你甚至不需要演绎指南。

【讨论】:

  • 谢谢。您能否提供参考 gcc 的建议?这个语法是什么{some_field}。最后一个是否可以声明类字段?
  • make_wrapper 有时会浪费复制:make_X 在我看来应该是完美的。
  • @HannaKhalil 已添加。这称为列表初始化。我不知道你在问什么。
  • @Yakk-AdamNevraumont “应该完美向前”,仅在 make_wapper(T &amp;&amp;val) 的情况下。
  • @Yakk-AdamNevraumont 不用担心。仅仅因为它是一个旧答案,并不意味着它不应该是一个好的答案:-)
【解决方案2】:
#define typeof(...) std::remove_reference_t<decltype(__VA_ARGS__)>;

但是,如果您想为类型 T 创建存储,在 C++11 中执行此操作的方法是使用 std::decay_t,或者在某些情况下编写您自己的扩展,将 C 样式数组存储到std::array

Wrapper<std::decay_t<T>> wrapper_some_field;

如果你想传递Wrapper 一个适合存储在其中的类型。

decay 删除引用,将函数转换为指向函数的指针,将 T 的数组转换为指向 T 的指针,然后删除顶级 constvolatile。这些操作类似于将事物作为“衰减到指针/值”操作的一部分传递给函数时发生的操作。

结果是“适合存储”的类型。如前所述,我希望 int[4] 衰减到 std::array&lt;int,4&gt; 但你不能拥有所有东西

【讨论】:

  • typeof(int) 给出intdecltype(int) 是一个错误。
猜你喜欢
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2023-03-31
  • 2021-02-18
  • 2012-08-15
  • 2012-06-07
  • 1970-01-01
相关资源
最近更新 更多