C++ 类构造时隐式转换的小疑惑
最近在学 C++的相关知识,在学习类模板参数的辅助自动推导时,有了些疑问,请看下面代码:
template <typename T, typename Cont = std::vector<T>> class Stack { private: Cont elems; public: Stack() = default; Stack(Stack const &) = default; Stack(T const &elem) : elems({elem}) {} }; Stack(char const *)->Stack<std::string>; // CATD
在构造这个类的时候:
Stack stringStack = "bottom"; // MSVC 16.9 编译通过,GCC-10 编译不通过 Stack stringStack{"bottom"}; // MSVC 16.9 和 GCC-10 均编译通过
请问为什么第一个构造方式 GCC 编译不通过呢,是否是因为 MSVC 又启用了某些魔改插件?个人理解是从 Char const[7]或 char const* 转换到 string 算一次转换,然后从 string 到 Stack 进行了二次转换,而 C++只允许进行一次隐式转换,不知是否正确