我知道:
typeof是gcc的扩展,不是C++标准的一部分。问题:
typeof这个词在C++11中被废弃了吗?换句话说,在使用C++11时,还允许它作为gcc扩展吗?typeof替换每个decltype会产生相同的代码行为,这种说法正确吗?template<typename T> class wrapper。声明wrapper_some_field的最佳方法是什么,使其等价于:Wrapper<typeof(some_field)> wrapper_some_field发布于 2016-06-06 15:22:50
typeof这个词在C++11中被废弃了吗?换句话说,在使用C++11时,还允许它作为gcc扩展吗?
这不是反对的。它从来没有作为关键字存在。gcc 建议表示,如果您使用-std=c++**编译,那么您可以使用__typeof__。
用
typeof替换每个decltype会产生相同的代码行为,这种说法正确吗?
不是的。例如,考虑到:
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中,您甚至不需要扣减指南。
发布于 2016-06-06 15:35:45
#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,然后删除顶级const和volatile。这些操作类似于将事物作为“衰变到指针/值”操作的一部分传递给函数时所发生的情况。
其结果是一种“适合储存”的类型。如前所述,我更喜欢int[4]衰变而不是std::array<int,4>,但您不可能拥有所有的东西。
https://stackoverflow.com/questions/37660862
复制相似问题