【问题标题】:Workaround for gcc bug: using chrono_literals in template breaks string_literalsgcc 错误的解决方法:在模板中使用 chrono_literals 会破坏 string_literals
【发布时间】:2016-04-08 09:21:18
【问题描述】:

在 GCC 4.9.2 中,以下代码无法编译:

#include <chrono>
#include <string>

using namespace std::literals::string_literals;
using namespace std::literals::chrono_literals;

template<typename T>
struct S
{
    S()
    {
        "hello"s;
    }
};

int main()
{
    S<int> s;
}

给予errors,开头为:

error: no matching function for call to 'operator""s()'

如果我注释掉chrono_literals 行没有错误,非模板类也没有错误。


我认为这是一个 gcc 4.9 错误,因为相同的代码在 GCC 5 和 clang 中工作。我的问题是:有没有一种解决方法可以让我在这个编译器版本的模板中同时使用 std::string 文字和 chrono 文字?

例如,我可以在其中一个标准标头中编辑的内容,或者我可以在我的代码中全局执行的内容?

注意:此编译器版本没有隐含的using namespace std::literals::chrono_literals,因为 C++ 标准似乎要求这样做;这也是在 GCC 5 中添加的。

【问题讨论】:

  • 您是否需要在顶层设置using?你需要在同一个函数中使用两者吗?范围相同?

标签: c++ gcc chrono compiler-bug


【解决方案1】:

如果您不需要在同一范围内使用两者,则只需在需要的地方使用 using

否则我会根据libstdc++ header 重新实现我自己的字符串文字,并称它们为不同于s 的东西(无论如何你都会收到警告)...比如_s。当然,你也可以实现自己的chrono literals,但这些似乎有点多。

#include <string>   
#include <chrono>


inline std::basic_string<char>
operator""_s(const char* __str, size_t __len)
{ return std::basic_string<char>{__str, __len}; }


template<typename T>
struct S
{
    S()
    {
        {
            using namespace std::literals::chrono_literals;
            10s;
            "hello"_s;
        }
        {
            using namespace std::literals::string_literals;
            "hello"s;
        }
    }
};

int main()
{
    S<int> s;
}

code on godbolt

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    相关资源
    最近更新 更多