相关疑难解决方法(0)

constexpr函数允许什么?

constexpr函数不应包含:

非文字类型变量的定义

但是在这个答案中,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;
    }();
}
Run Code Online (Sandbox Code Playgroud)

在我的评论中,我定义了div_t一个:如何初始化div_t对象?

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;
}
Run Code Online (Sandbox Code Playgroud)

究竟是什么意思禁止"非字面型变量的定义"?

Visual Studio 2015将不允许我对a的定义,div_t但我发现在lambda中包含这些非法行为并执行它是允许的,这是荒谬的.我想知道哪个编译器在div_t定义方面表现正常.

c++ function constexpr c++14 c++17

13
推荐指数
1
解决办法
8489
查看次数

为什么Visual Studio不允许我在enable_if中使用Templatized,constexpr函数?

所以我把它归结为最小的,完整的,可验证的例子,看起来Visual Studio 2015似乎不允许我使用一个模板化的constexpr函数enable_if.

例如:

template <typename T>
constexpr bool condition() { return sizeof(T) > 1; }
Run Code Online (Sandbox Code Playgroud)

给我错误:

错误C2995 :: enable_if<_Test,T>::type test(void)功能模板已经定义

当我尝试在替换中使用它时,失败不是像这样的错误编译:

template <typename T>
enable_if_t<condition<T>()> test() { cout << "true\n"; }

template <typename T>
enable_if_t<!condition<T>()> test() { cout << "false\n"; }
Run Code Online (Sandbox Code Playgroud)

这在gcc中运行良好:http ://ideone.com/m9LDdS
如果我删除了它的模板化,它在Visual Studio 2015中工作正常condition.我相信constexpr函数是在中引入的,为什么Visual Studio 2015不支持这个?这是一个错误吗?

c++ templates constexpr c++11 visual-studio-2015

8
推荐指数
1
解决办法
639
查看次数

什么是自动括号列表语法?

WF 在这里给出了一个现在删除的答案我的问题使用了这一行:

auto [x, y] = div_t{ 1, 0 };
Run Code Online (Sandbox Code Playgroud)

从答案的代码看起来这像是tiediv_t结构.我希望有人能解释这里发生的事情.完整的功能代码如下:

constexpr bool first_quot() {
    auto [x, y] = std::div_t{1, 0};
    (void)y;
    return x;
}
Run Code Online (Sandbox Code Playgroud)

c++ decomposition auto c++17

2
推荐指数
1
解决办法
125
查看次数