首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11中的关键字类型

c++11中的关键字类型
EN

Stack Overflow用户
提问于 2016-06-06 15:09:21
回答 2查看 16.6K关注 0票数 9

我知道:

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

问题:

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

回答 2

Stack Overflow用户

发布于 2016-06-06 15:22:50

typeof这个词在C++11中被废弃了吗?换句话说,在使用C++11时,还允许它作为gcc扩展吗?

这不是反对的。它从来没有作为关键字存在。gcc 建议表示,如果您使用-std=c++**编译,那么您可以使用__typeof__

typeof替换每个decltype会产生相同的代码行为,这种说法正确吗?

不是的。例如,考虑到:

代码语言:javascript
复制
int& foo();

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

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

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

代码语言:javascript
复制
template <class T> wrapper<T> make_wrapper(T const& val) { return {val}; }
auto wrap = make_wrapper(some_field);

或者,通过转发:

代码语言:javascript
复制
template <class T>
wrapper<std::decay_t<T>> make_wrapper(T&& val) {
    return {std::forward<T>(val)};
}

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

代码语言:javascript
复制
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中,您甚至不需要扣减指南。

票数 12
EN

Stack Overflow用户

发布于 2016-06-06 15:35:45

代码语言:javascript
复制
#define typeof(...) std::remove_reference_t<decltype(__VA_ARGS__)>;

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

代码语言:javascript
复制
Wrapper<std::decay_t<T>> wrapper_some_field;

如果您想要传递Wrapper,则需要一个适合在其中存储的类型。

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

其结果是一种“适合储存”的类型。如前所述,我更喜欢int[4]衰变而不是std::array<int,4>,但您不可能拥有所有的东西。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37660862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档