我对以下元组业务感到有些困惑:
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的错误,但是所有编译器都给出了相同的结果.
在此代码中,分配给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) 我想制作重载函数,这些函数将共享指针指向基类和派生类.它似乎适用于引用和原始指针,但不适用于额外派生类的共享指针.请参阅示例代码:
#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)