静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?

What type does static auto constexpr t = {"red", "black", "green"}; derive to?

本文关键字:类型 是什么 派生 green black constexpr 静态 red      更新时间:2023-10-16

所以我弄乱了一些代码,我决定我想要某种字符串列表......所以后来我想 - 我懒得弄清楚要使用什么类型等等,所以我会把它打成一个自动变量,就像这样:

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::beginstd::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';
}