静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
What type does static auto constexpr t = {"red", "black", "green"}; derive to?
所以我弄乱了一些代码,我决定我想要某种字符串列表......所以后来我想 - 我懒得弄清楚要使用什么类型等等,所以我会把它打成一个自动变量,就像这样:
static auto constexpr t = {"red", "black", "green"};
和编译的代码。太好了,所以既然这样:
static auto constexpr str = "green";
派生到一个char[]
我假设{"红色","黑色","绿色"}可能是*char[]或类似的东西,因此我可以写:
std::cout << "value 1 is: " << t[1] << std::endl;
这给了我错误:
main.cpp:18:56:错误:与"运算符 []"不匹配(操作数类型为 'const std::initializer_list' 和 'int'(
所以我假设类型是"initializer_list"?有没有办法我可以做这样的事情:t[1]
获取字符串"black"(假设索引从 0 开始(?
所以我假设类型是"initializer_list"?
是的。
有没有办法我可以做这样的事情:t[1] 来获取字符串"black"(假设索引从 0 开始(?
使用std::array
,它与 C++17 类模板类型推导很好地配合使用:
static auto constexpr t = std::array{"red", "black", "green"};
std::cout << t[1] << "n"; // outputs 'black'
如果将编译时常量传递给operator[]
或std::get
,则会保留constexpr
-ness。
constexpr const char* black = t[1];
constexpr const char* red = std::get<0>(t);
类型为 std::initializer_list 的对象是一个轻量级代理对象,它提供对 const T 类型的对象数组的访问。 (https://en.cppreference.com/w/cpp/utility/initializer_list(
但是,它没有operator[]
成员函数,唯一的访问器std::initializer_list::begin
和std::initializer_list::end
。 例如:
#include <iostream>
#include <initializer_list>
#include <stdexcept>
namespace my {
template <typename T>
constexpr auto get(std::initializer_list<T> lst, std::size_t i)
{
if ( i >= lst.size() )
throw std::out_of_range("Out of bounds access.n");
return *(lst.begin() + i);
}
template <std::size_t I, typename T>
constexpr auto get(std::initializer_list<T> lst)
{
// Note: https://stackoverflow.com/questions/5438671/static-assert-on-initializer-listsize
if ( I >= lst.size() )
throw std::out_of_range("Out of bounds access.n");
return *(lst.begin() + I);
}
}
int main()
{
// Note: https://stackoverflow.com/questions/16063123/is-it-legal-to-declare-a-constexpr-initializer-list-object
static constexpr auto t = {"red", "black", "green"};
std::cout << my::get(t, 1) << 'n' << my::get<2>(t) << 'n';
}
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- std::chrono::duration::count函数的实际结果类型是什么
- c++运算符重载-我实际返回的操作数类型是什么
- 运算符和返回类型是什么意思?
- 指向 2D 数组的指针的类型是什么?
- RSA_verify中预期的数据类型是什么,无法验证从 Java 生成的签名
- 共享_ptr中多功能数组的类型是什么
- 构造函数的类型是什么?
- 字符串中单个字符作为数组的数据类型是什么
- 该结构继承的类型是什么
- 如果我获得Integer和Double的产品,输出的数据类型是什么
- C 中被视为可可的类型是什么
- 当函数采用右值引用时,函数中该变量的类型是什么?
- STD :: SETW,STD :: SETFILL等的真实返回类型是什么?
- 模板类中引用的引用的类型是什么
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 包含通过引用捕获的 lambda 函数的"variable"的类型是什么?
- 通过插座发送的内容的数据类型是什么