constexpr
functions不应该包含:在constexpr函数中允许什么?
非文字类型
但在此答案的λ是一个所定义的变量的定义:https://stackoverflow.com/a/41616651/2642059
template <typename T>
constexpr auto make_div(const T quot, const T rem)
{
return [&]() {
decltype(std::div(quot, rem)) result;
result.quot = quot;
result.rem = rem;
return result;
}();
}
在我的评论中,我定义了div_t
中的一个:How can I Initialize a div_t Object?
template <typename T>
constexpr decltype(div(T{}, T{})) make_div(const T quot, const T rem)
{
decltype(div(T{}, T{})) x{};
x.quot = quot;
x.rem = rem;
return x;
}
究竟是什么意思是禁止“定义非文字类型的变量”?
Visual Studio 2015不会允许我定义div_t
,但我觉得它可能只是将这种非法行为包装在lambda中并执行它是可以允许的。我想知道哪一个编译器在div_t
定义方面表现正确。
什么版本的C++语言?这些要求比2011年有所放松。 – rubenvb
@rubenvb好的问题,我编辑过。但是C++ 14。 –
lambda表达式是一个表达式,而不是一个变量定义。但是在C++ 17之前,lambda表达式不能出现在[常量表达式](http://en.cppreference.com/w/cpp/language/constant_expression)中。事实上,[当上下文需要不断表达时,MSVC会抱怨](http://rextester.com/ZBRLBR12534)。 – cpplearner