我试图继承名称很长的模板基类的构造函数。对于这个基类,我引入了类型别名。(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++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)