类模板参数推导失败会导致替换失败

时间:2018-07-12 23:14:36

标签: c++ templates c++17 type-deduction

我有一个简单的程序,试图用来测试C ++ 17的类模板参数推导。

#include <iostream>
#include <list>

int main(int argc, const char * argv[]) {
    const char* a = "Hello";
    std::list x(1, a);
    return 0;
}

我想std :: list推断类型为const char*的列表。但是,当尝试运行此代码时,出现错误No viable constructor or deduction guide for deduction of template arguments of 'list'。具体而言,应与此list(size_type __n, const value_type& __x);相匹配的构造函数报告错误,提示:

Candidate template ignored: substitution failure [with _Tp = const char *, _Alloc = std::__1::allocator<const char *>]: 'size_type' is a protected member of 'std::__1::__list_imp<const char *, std::__1::allocator<const char *> >'

我很好奇为什么这行不通,但是像这样的程序完全可以用std::pair构成,并且可以轻松推论出参数:

#include <iostream>
#include <list>

int main(int argc, const char * argv[]) {
    const char* a = "Hello";
    std::pair x(1, a);
    return 0;
}

谢谢。

1 个答案:

答案 0 :(得分:1)

clang 5和6以及gcc 7和8可以毫无问题地编译您的代码。因此,您正在使用的编译器未正确实施推论指南,或者使用的库没有针对std::list

的适当推论指南