gpt4 book ai didi

c++ - gcc c++11 对用户定义的常量和模板参数包的限制

转载 作者:IT老高 更新时间:2023-10-28 23:02:33 27 4
gpt4 key购买 nike

我一直在使用 gcc 4.7.2 中的用户定义常量,遇到了一些我不太了解的大小限制因素。

这个想法是为定点十进制类型定义一个 constexpr 运算符“”。我想避免从 double 转换,而是在编译时使用可变参数模板解析尾数和指数。尾数解析有点棘手。

当我启用下面代码底部的 3 个禁用行中的任何一个时,gcc 会陷入无限循环并卡在那里。我注意到浮点文字的最大大小和可变参数模板的显式实例化相同,但整数文字的大小稍大。

我使用命令:g++ -std=c++11 -Wall -g -o literal_value literal_value.cpp

使用 -ftemplate-depth-128 没有区别。

#include <iostream>
#include <cstdint>

typedef std::uint64_t value_type;

template<value_type Temp, char... List> struct literal_parser;

template<value_type Temp, char Head, char... List>
struct literal_parser<Temp, Head, List...>
{
static const value_type value = Head == '.' ?
literal_parser<Temp, List...>::value :
literal_parser<Temp * 10 + Head - '0', List...>::value;
};

template<value_type Temp, char Last>
struct literal_parser<Temp, Last>
{
static const value_type value = Last == '.' ?
Temp : Temp * 10 + Last - '0';
};

template<char... List>
inline constexpr value_type operator"" _value() noexcept
{
return literal_parser<0U, List...>::value;
}

int main()
{
std::cout << "value 1: " << 123456789012345678_value << std::endl;
std::cout << "value 2: " << 1.23456789012345_value << std::endl;
std::cout << "value 3: " << literal_parser<0U, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5'>::value << std::endl;

#if 0
std::cout << "value 4: " << 1234567890123456789_value << std::endl;
std::cout << "value 5: " << 1.234567890123456_value << std::endl;
std::cout << "value 6: " << literal_parser<0U, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6'>::value << std::endl;
#endif
}

这是 gcc 中的错误还是我遗漏了什么?

最佳答案

我必须说你发现了一些让编译器发疯的绝妙案例 :-) 对我来说 gcc 4.7.2 和 4.8 在编译期间崩溃了。然而,clang(顶级版本)编译了整个代码,但使用的是 2.4GB RAM。问题似乎与 '.' 的 ternaty 运算符有关。查看。如果你删除它并在 main() 中注释实数测试,一切都会编译得很好。

所以回答你的问题你可能不会错过任何东西,gcc 和 clang 可能需要根据你的情况修改他们的实现。

关于c++ - gcc c++11 对用户定义的常量和模板参数包的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13381678/

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