【发布时间】:2017-05-27 21:05:45
【问题描述】:
constexpr functions 不应包含:
非文字类型变量的定义
但在这个答案中,一个 lambda 被定义在一个: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 好问题,我已经编辑过了。但是 C++14。
-
一个 lambda 表达式是一个表达式,而不是一个变量定义。但在 C++17 之前,lambda 表达式不能出现在 constant expression 中。确实,when the context requires a constant expression, MSVC will complain.
-
@cpplearner 所以我的(第一个)示例仅在 constexpr 函数被评估为 const 函数时编译?在我看来,第二个例子不应该按定义编译。
-
我认为 VS2015 不支持 C++14 扩展
constexpr。这解释了您的第二个函数模板,因为在 C++11 中constexpr函数基本上仅限于单个 return 语句;它与“非文字类型”无关(div_t是文字类型)。第一个是格式不正确的 NDR pre-C++17。
标签: c++ function c++14 constexpr c++17