C ++ 17类模板参数推导指南和字符串文字

时间:2017-12-12 08:44:57

标签: c++ c++17 argument-deduction

构造函数按值T获取,因此字符串文字将衰减为char const*

使用扣除指南Stack(char const*) -> Stack<std::string>
我希望这两种情况都有效。

为什么第二个参数推论Stack ss2 = "string literal"没有?

#include<vector>
#include<string>

template<typename T>
class Stack {
    std::vector<T> elems;
public:
    Stack() = default;
    Stack(T elm) : elems({std::move(elm)}) { }
};

Stack(char const*) -> Stack<std::string>;

void test() {
    Stack ss1 { "works fine."};
    // error: conversion from 'const char [15]' to
    // non-scalar type 'Stack<std::__cxx11::basic_string<char> >' 
    // requested
    Stack ss2 = "compile error!"; 
}

编译器资源管理器:https://godbolt.org/g/z3PaBp

1 个答案:

答案 0 :(得分:0)

Stack ss2 = "compile error!";

这试图:

  • 将字符串文字(字符数组,char [15])转换为临时字符串

  • 将临时字符串转换为Stack

因为这个原因失败了:

  • 隐式转换序列不能涉及多个用户定义的转换。需要两个

请在此处查看重复问题的完整答案error: conversion from 'const char [5]' to non-scalar type in c++