C++17 类模板参数推导指南和字符串文字
C++17 class template argument deduction guides and string literals
构造函数按值获取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]"转换为非标量类型
相关文章:
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 如果我在块中编写字符串文字,是否会从数据部分复制整个字符串数据?
- C++ 不能在cout中使用向量和字符串文字
- 为什么必须将 const 添加到 constexpr 中才能进行字符串文字声明?
- C++:Unicode 字符串文字的可移植性
- 返回空字符串文字 VS. 返回空点 - 它们是一样的吗?
- 确保字符指针始终指向相同的字符串文字
- 如何按照 Google C++风格指南连接字符串文字?
- 通过 constexpr 中的 'const char *' glvalue 访问字符串文字的值会出错
- 字符串文字到 char 数组的转换如何在C++中实际工作
- 另一个字符串文字,UDL 迷宫
- strlen 是否针对字符串文字进行了优化?
- 用户定义的字符串文字为字符串null终止