gpt4 book ai didi

c++ - 在 VS2017 中编译错误 C2027 但不是 Clang 小对象优化

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:33 26 4
gpt4 key购买 nike

所以我试图在我的一个项目中实现小对象优化,但我遇到了一个奇怪的编译器错误。下面是一些重现该问题的简化代码:

#include <type_traits>

template<typename T>
class Wrapper {
T thing;
public:
Wrapper(T&& thing) {
// ...
}
};

class Test {
static const size_t PADDING_SIZE = 64;
public:
template<
typename T,
std::enable_if_t<sizeof(Wrapper<std::decay_t<T>>) <= PADDING_SIZE, int> = 0
// Error on this line ^
>
Test(T&& thing) {
new (padding) Wrapper<std::decay_t<T>>(std::forward<T>(thing));
}

char padding[PADDING_SIZE];
};

int main() {
auto t = Test(0.0f);
}

基本上,我需要获取一个任意对象,将其放入包装器中,并在填充中实例化包装器的一个实例,但我需要为适合填充的类型使用一个包装器,并为适合填充器的类型使用另一个包装器类型太大(其中一个包装器将对象存储在适当的位置,而另一个包装器为其分配外部空间)。显然我愿意支持完美转发。

不幸的是,VS2017 给我以下编译器错误:error C2027: use of undefined type 'Wrapper<decay<_Ty>::type>' .我可以用 Wrapper<T> 编译它而不是 Wrapper<std::decay_t<T>> ,但我想我需要使用 decayed 类型。 Clang 按原样编译它。

那么这里有什么问题呢?我有点卡住了。

最佳答案

可能是 VS 编译器中的错误。

我可以用稍微不同形式的 sfinae 条件编译它,使用默认类型而不是默认值:

#include <type_traits>
#include <new>

template<typename T>
class Wrapper {
T thing;
public:
Wrapper(T&& ) {
// ...
}
};

class Test {
static const size_t PADDING_SIZE = 64;
public:
template<
typename T,
class = std::enable_if_t<sizeof(Wrapper<std::decay_t<T>>) <= PADDING_SIZE>
>
Test(T&& thing) {
new (padding) Wrapper<std::decay_t<T>>(std::forward<T>(thing));
}

char padding[PADDING_SIZE];
};

int main() {
auto t = Test(0.0f);
}

没有真正解释为什么这应该更好用,这只是我通常使用的形式。

关于c++ - 在 VS2017 中编译错误 C2027 但不是 Clang 小对象优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47686611/

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