小编Jak*_*dle的帖子

为什么使用格式错误的函数而不是隐式转换?

这是我的代码段:

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)

它只是工作正常.

看起来,任何只需要廉价演员的功能,即使是格式错误,也隐藏着隐含但昂贵的演员功能.有人有线索吗?

c++ ambiguity malformed overload-resolution c++11

5
推荐指数
1
解决办法
215
查看次数

如何std :: forward(*this)

因为我想重载一个成员函数的所有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)

但显然,即使在&&合格函数的情况下,结果表达式也总是解析为左值引用.

你能帮助我吗?

c++ c++14

5
推荐指数
1
解决办法
372
查看次数

为什么所有type_traits类都必须使用'typename'和':: type'Prefix/Suffix来调用?

这是一个奇怪的问题,虽然很明显:

为什么在所有模板<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 之外,是否有任何迹象表明价值特征会成为类似简化的一部分?

c++ templates typename type-traits c++11

0
推荐指数
1
解决办法
247
查看次数