小编Bar*_*bas的帖子

分配给std :: tie和引用元组有什么区别?

我对以下元组业务感到有些困惑:

int testint = 1;
float testfloat = .1f;
std::tie( testint, testfloat ) = std::make_tuple( testint, testfloat );
std::tuple<int&, float&> test = std::make_tuple( testint, testfloat );
Run Code Online (Sandbox Code Playgroud)

有了std::tie它的工作原理,而是直接引用不编译的元组分配,使

"错误:从'std :: tuple <int,float>'转换为非标量类型'std :: tuple <int&,float&>'required"

要么

"没有合适的用户定义的转换,从std :: tuple <int,float>到std :: tuple <int&,float&>"

为什么?我仔细检查了编译器是否真的与通过执行此操作分配的类型相同:

static_assert( std::is_same<decltype( std::tie( testint, testfloat ) ), std::tuple<int&, float&>>::value, "??" );
Run Code Online (Sandbox Code Playgroud)

评估为真.

我也在线查看是否可能是msvc的错误,但是所有编译器都给出了相同的结果.

c++ tuples reference

16
推荐指数
2
解决办法
1万
查看次数

为什么不使用私人基地的演员?

在此代码中,分配给b1有效,但它不允许分配给b2(有或没有静态强制转换).我实际上是试图解决相反的问题,公共继承但不是隐式转换为基础.然而似乎从未使用过演员.为什么是这样?

struct B {};    

struct D1 : private B {
    operator B&() {return *this;}
    B& getB() {return *this;}
};

struct D2 : public B {
    explicit operator B&() {return *this;}
};

struct D3 : public B {
    operator B&() = delete;
};

void funB(B& b){}

int main () {
  D1 d1;
  funB(d1.getB()); // works
  // funB(d1); // fails to compile with 'inaccessible base class
  D2 d2;
  funB(d2); // works
  D3 d3;
  funB(d3); // works 
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ inheritance casting implicit-cast explicit-conversion

11
推荐指数
1
解决办法
276
查看次数

具有共享指针参数歧义的函数重载

我想制作重载函数,这些函数将共享指针指向基类和派生类.它似乎适用于引用和原始指针,但不适用于额外派生类的共享指针.请参阅示例代码:

#include <memory>

class Base{};
class Derived : public Base {};
class ExtraDerived : public Derived {};


bool IsBase(Base*){ return true; }
bool IsBase(Derived*){ return false; }

bool IsBase(std::shared_ptr<Base>){ return true; }
bool IsBase(std::shared_ptr<Derived>){ return false; }

int main() 
{
    auto derived = std::make_shared<Derived>();
    auto extra_derived = std::make_shared<ExtraDerived>();
    // works
    auto raw_result_derived = IsBase(derived.get());
    auto raw_result_extra_derived = IsBase(extra_derived.get());
    auto shared_result_derived = IsBase(derived);
    // doesn't work
    auto shared_result_extra_derived = IsBase(extra_derived);
}
Run Code Online (Sandbox Code Playgroud)

我得到:"错误C2668:'IsBase':使用Visual Studio 2012时模糊调用重载函数",但是当我在这里尝试代码时,我也得到了相同的结果http://ideone.com/6uoa0p.

这似乎不是所希望的行为(因为它适用于'原始'的东西).这是模板的限制吗,还有另一个原因导致这不起作用或者它是一个错误吗?我怎样才能以最不丑的方式使它工作?

我能想到的最好的是

//ugly workaround
bool …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance overloading shared-ptr c++11

6
推荐指数
1
解决办法
1028
查看次数