这是我的代码段:
class Base{};
class Derived : private Base{};
template<class T>
class Wrapper
{
public:
template<typename T2>
Wrapper( T2&& )
{ }
};
// Function declarations
void func( Base& param );
void func( Wrapper<Derived> );
void funcUnambiguous( Wrapper<Derived> );
// Here is the Call:
Derived d = Derived();
func( d ); // <- Error
Run Code Online (Sandbox Code Playgroud)
GCC 4.9给了我: error: 'Base' is an inaccessible base of 'Derived'
而我这样做
Derived d = Derived();
funcUnambiguous( d );
Run Code Online (Sandbox Code Playgroud)
它只是工作正常.
看起来,任何只需要廉价演员的功能,即使是格式错误,也隐藏着隐含但昂贵的演员功能.有人有线索吗?
因为我想重载一个成员函数的所有cv和引用资格,我自己写了下面的宏:
#define DEFINE_FUNCTION(sig , functionality) \
sig & { functionality; } \
sig && { functionality; } \
sig const & { functionality; } \
sig const && { functionality; } \
sig volatile & { functionality; } \
sig volatile && { functionality; } \
sig const volatile & { functionality; } \
sig const volatile && { functionality; }
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我想以*this转发方式返回(即this在返回类型中保留-pointer的所有引用和cv限定,似乎,我必须手动编写所有这8个重载.
现在我的问题是:是否有可能以*this通用方式获得cv和引用限定类型?
我试过decltype(auto)作为返回类型和
return std::forward<decltype(*this)>(*this);
Run Code Online (Sandbox Code Playgroud)
但显然,即使在&&合格函数的情况下,结果表达式也总是解析为左值引用.
你能帮助我吗?
这是一个奇怪的问题,虽然很明显:
为什么在所有模板<type_traits>都被一个名为typenname和::type前缀/后缀?
当然,一个原因是没有像C++ 0x这样的模板化typedef using,它允许以下内容:
template<typename T>
using remove_ref = typename std::remove_reference<T>::type;
remove_ref<int&> foo = 4;
Run Code Online (Sandbox Code Playgroud)
所以这个问题不太重要,为什么它目前是这样的,而是更多关于这种行为是否会在未来的C++标准中被简化?.
类似的改进可能会带来如下特征std::is_pointer<T>::value- 我已经可以在C++ 14/17的视野中看到模板化的常量,它们可以使用类似的东西std::is_pointer<T>.
注意:据我所知,这种简化不是任何有关即将推出的C++标准的已发布项目的主题.在这种情况下,这个问题没有真正的是/否答案,并且这个线程可以充当pro/con列表,是否可能在任何新版本的C++中更改.
编辑:
感谢@Drew_Dormann和@erenon正确地指出已经有_t所有类型特征模板添加的版本正是这样做的.
然而,它仍然是开放的,std::is_pointer除了std::is_pointer<T>()-Version 之外,是否有任何迹象表明价值特征会成为类似简化的一部分?