1

std::to_string()在以下 lambda 函数中遇到问题:

#include <iostream>
#include <string>


inline constexpr int a_global_constant { 12345 };


int main( )
{
    auto calculateMsgLength = [ ] ( ) consteval -> std::size_t
    {
        std::string str1 { "Part 1 " };
        std::string str2 { "Part 2 " };
        std::string msg { str1 + str2 /*+ std::to_string( a_global_constant )*/ };

        // The complete message should look like this: Part 1 Part 2 12345

        return msg.length( );
    };

    constexpr std::size_t msgLength { calculateMsgLength( ) };

    std::cout << "Message length == " << msgLength << '\n';
}

上面的代码不能在我的GCC v11.2上编译,因此我必须在编译器资源管理器中使用GCC(主干)来编译它。

但是,仅取消注释对它的调用std::to_string()不会编译:

<source>: In function 'int main()':
<source>:19:61: error: 'main()::<lambda()>' called in a constant expression
   19 |         constexpr std::size_t msgLength { calculateMsgLength( ) };
      |                                           ~~~~~~~~~~~~~~~~~~^~~
<source>:10:35: note: 'main()::<lambda()>' is not usable as a 'constexpr' function because:
   10 |         auto calculateMsgLength = [ ] ( ) consteval -> std::size_t
      |                                   ^
<source>:10:35: error: call to non-'constexpr' function 'std::string std::__cxx11::to_string(int)'
.
.
.

在不久的将来某个时候会std::to_string用STL 制作吗?constexpr还是我应该寻找另一种方法来做到这一点?有什么替代方法std::to_string

4

1 回答 1

1

std::to_string在不久的将来某个时候会在 STL 中制作 constexpr 吗?还是我应该寻找另一种方法来做到这一点?有什么替代方法std::to_string

我不知道std::to_string, 但是整数类型的std::to_chars(和)计划可能会通过P2291出现在 C++23 中。不知道为什么不,至少对于整数类型。std::from_charsconstexprstd::to_string

也就是说,如果您只想std::string在编译时将基数为 10 的整数转换为 a,那么这是一个相当容易编写的算法。唯一棘手的部分是处理INT_MIN(因为如果它是负数,你不能仅仅否定这个论点,那会溢出)。但是由于这是一个constexpr函数,如果你弄错了,那就是编译错误,这使得它更容易正确。

于 2022-01-16T04:33:03.273 回答