MSVC可匹配tagged_tuple构造函数但GCC、Clang无法匹配问题
tagged_tuple继承std::tuple构造函数问题解答
这不是GCC/Clang的bug,是你对C++构造函数继承的规则存在遗漏,MSVC的正常运行属于非标准的编译器扩展行为。
核心规则说明
C++标准明确规定:通过using 基类类名::基类类名的方式继承基类构造函数时,不会继承基类的默认构造函数、拷贝构造函数、移动构造函数,这三类特殊成员函数始终按照派生类的常规规则生成,不会从基类继承。
问题根因
你的tagged_tuple的基类value_type就是对应类型的std::tuple,你测试的代码foo b{a}中,a是基类std::tuple<int, std::string>类型的左值,这个调用本来需要匹配基类的拷贝构造函数完成基类子对象的初始化,但拷贝构造函数不会被using value_type::value_type引入派生类,因此GCC/Clang按照标准行为抛出找不到匹配构造函数的错误。
MSVC对构造函数继承做了不符合标准的扩展,会默认继承基类的拷贝、移动构造函数,因此你的代码在VS2019上可以正常运行。
优化建议
你手动添加的构造函数仅能覆盖非const左值tuple的构造场景,建议补充完整三类值类型的构造函数,覆盖所有使用场景:
template <class... Types> constexpr tagged_tuple(const std::tuple<Types...>& tuple) : value_type(tuple) {} template <class... Types> constexpr tagged_tuple(std::tuple<Types...>& tuple) : value_type(tuple) {} template <class... Types> constexpr tagged_tuple(std::tuple<Types...>&& tuple) : value_type(std::move(tuple)) {}
内容的提问来源于stack exchange,提问作者legendaryzyper
相关产品推荐
相关产品推荐

