Adr*_*ian 7 c++ c++11 visual-studio-2015
是否可以验证传递给constexpr构造函数的初始化列表是否具有特定大小?或者这只能在运行时进行?
这是想法,但它不起作用:
struct group
{
constexpr group(
std::initializer_list<std::initializer_list<UINT const> const> groups
)
{
static_assert(each_list_size_greater_than_1(groups.begin(), groups.end()));
}
constexpr static bool each_list_size_greater_than_1(
std::initializer_list<std::initializer_list<UINT const> const>::const_iterator const begin
, std::initializer_list<std::initializer_list<UINT const> const>::const_iterator const end)
{
return begin == end || begin->size() > 1 && each_list_size_greater_than_1(begin + 1, end);
}
};
Run Code Online (Sandbox Code Playgroud)
我看过VS2015的std::initializer_list实现begin(),end()并且size()都是constexpr功能.
Die*_*ühl 10
虽然size()一个std::initializer_list<T>可以评估到constexpr的size()成员将不会表现得像一个constexpr一个内部constexpr的功能:它是故意的对象只是表现得像constexpr在内部constexpr他们在那里介绍,但其他地方没有表情.
例如:
constexpr get_size(std::initializer_list<int> list) {
constexpr std::size_t csize = list.size(); // ERROR (1)
std::size_t size = list.size(); // OK
return size;
}
int main() {
constexpr std::size_t csize = get_size(std::initializer_list<int>{ 1, 2, 3 }); // OK (2)
// ...
}
Run Code Online (Sandbox Code Playgroud)
在第一种情况(1)中,假定产生a的值constexpr取决于在constexpr开始之前创建的数据.因此,它不会评估为a constexpr.在第二种情况(2)中,数据被定义在,constexpr并且因此,结果可以变为a constexpr.
我没有参与导致这种设计的讨论,但它似乎是出于防止constexpr参数改变constexpr函数结果类型的愿望的动机:如果值constexpr在函数定义中,它们也会constexpr在因此,返回值可以用作返回类型中的模板参数.这将导致constexpr产生不同类型的不同值.到目前为止,只能通过改变函数的参数类型和/或通过更改函数的参数数量来获得不同的返回类型.
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |