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

C++17 class template argument deduction guides and string literals

本文关键字:字符串 文字 参数 C++17      更新时间:2023-10-16

构造函数按值获取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

Stack ss2 = "compile error!";

这将尝试:

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

  • 将临时字符串转换为堆栈

由于以下原因,此操作失败:

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

在此处查看重复问题的完整答案 错误:在 c++ 中从"const char [5]"转换为非标量类型