最近在学 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++只允许进行一次隐式转换,不知是否正确
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.