小编Osy*_*otr的帖子

使用类型别名继承基类构造函数的正确方法?

我试图继承名称很长的模板基类的构造函数。对于这个基类,我引入了类型别名。(https://godbolt.org/z/aqf6czPdo

class Object {};
class Gadget {};

class SuperBase : public Object { using base_t = Object; };
class Params : public Gadget { using base_t = Gadget; };

template<class T, class TParams>
class Base : public SuperBase, public TParams {};

template<class T>
class Derived : public Base<T, Params>
{
    using base_t = Base<T, Params>;
public:
    using base_t::base_t;
};
Run Code Online (Sandbox Code Playgroud)

此代码可以使用 GCC 和 Clang 成功编译,但不能使用 MSVC/permissive-标志进行编译

error C2385: ambiguous access of 'base_t'
note: could be the 'base_t' …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates using language-lawyer

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

为什么pair的比较运算符比用户提供的运算符&lt;更喜欢转换?

切换到 C++20 后,我发现我们的一些测试失败了。以下代码的输出在 C++17 和 C++20 模式之间有所不同:

https://godbolt.org/z/hx4a98T13

class MyString
{
public:
    operator char const *() const
    {
        std::printf("convert ");
        return nullptr;
    }

    bool operator<(MyString const & other) const
    {
        std::printf("MyString::operator< ");
        return 1;
    }
};

int main()
{
    MyString s1;
    MyString s2;
    std::printf("s1 < s2 = %d\n", s1 < s2);

    std::pair<MyString, MyString> pair1;
    std::pair<MyString, MyString> pair2;
    std::printf("pair1 < pair2 = %d\n", pair1 < pair2);
}
Run Code Online (Sandbox Code Playgroud)
/// C++17
MyString::operator< s1 < s2 = 1
MyString::operator< pair1 < pair2 = 1 …
Run Code Online (Sandbox Code Playgroud)

c++ comparison-operators c++20

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