gpt4 book ai didi

c++ - 使用 constexpr 函数作为参数时,enable_if 在 Visual Studio 中不起作用

转载 作者:可可西里 更新时间:2023-11-01 16:23:49 26 4
gpt4 key购买 nike

我目前正在研究 Visual Studio 2017(如果有任何帮助,请使用 /std:c++latest 进行编译)。

有问题的代码只是根据一些模板化 constexpr 函数的结果选择结构特化。 GCC 和 clang 编译它没有问题。

这是我的 MCVE:

#include <type_traits>

struct A {
enum {
test_trait = true
};
};

template<typename T>
constexpr int choose() {
return T::test_trait;
}

template<typename T, typename Enable=void>
struct Chosen;

template<typename T>
struct Chosen<T, std::enable_if_t<choose<T>() == 1>> {};

void foo() {
// This works
constexpr int chosen = choose<A>();
static_assert(chosen == 1, "");

// This resolves to the undefined struct.
using Chosen_t = Chosen<A>;
Chosen_t x;
(void)x;
}

choose() 在我的代码库中实际上有点复杂,但是 static_assert 仍然可以编译,并且检查正常。

我有点假设如果 static_assert 编译,enable_if 没有理由不能发挥它的魔力。我错了吗?我猜“也许” T 在技术上不是 enable_if 的依赖类型......但如果是这样的话,我希望 GCC 和 clang 打我的手腕.

我可以通过将 choose() 的结果包装在 std::integral_constant 中来解决这个问题,如下所示:

template<typename T> 
struct Chooser : public std::integral_constant<int, choose<T>()> {};

template<typename T>
struct Chosen<T, std::enable_if_t<Chooser<T>::value>> {};

但我真的宁愿不必跳过这个圈套。

模板解析是否应该能够按照我期望的方式解决这个问题?我担心代码实际上是错误的,而 GCC 和 clang 只是对我手下留情。

最佳答案

MSVC 19.00.23506 中的代码似乎仍然存在问题。但是,它似乎只适用于多一层间接(也许是更好的解决方法):

template<typename T, bool>
struct ChosenImpl;

template<typename T>
struct ChosenImpl<T, true> {};

template<typename T>
using Chosen = ChosenImpl<T, choose<T>()>;

Demo

这样做的一个好处是我们对调用者隐藏了第二个模板参数,他们根本不关心这一点。

关于c++ - 使用 constexpr 函数作为参数时,enable_if 在 Visual Studio 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46144103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com