gpt4 book ai didi

c++ - nullptr 的运算符 <<(流输出)

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

考虑一段通用的 C++ 代码,它在参数不相等的情况下将其参数值输出到流:

#define LOG_IF_NE(a, b) if(a != b) { \
std::cerr << "Failed because (" << ##a << "=" << (a) << \
") != (" << ##b << "=" << (b) << ")"; \
}

这只是一个例子,真正的代码在将消息写入字符串流后会抛出异常。这适用于 2 个整数、2 个指针等流 operator <<。已定义。

int g_b;
int f(int a)
{
LOG_IF_NE(a, g_b);
// implementation follows
}

LOG_IF_NE 的参数之一时会出现问题是nullptr : MSVC++2013 编译器给出 error C2593: 'operator <<' is ambiguous .

int *pA;
int g()
{
LOG_IF_NE(pA, nullptr);
}

问题的发生是因为 nullptr有一个特殊类型和 operator <<未在该类型的 STL 中定义。答案在 https://stackoverflow.com/a/21772973/1915854建议定义 operator <<对于 std::nullptr_t

//cerr is of type std::ostream, and nullptr is of type std::nullptr_t
std::ostream& operator << (std::ostream& os, std::nullptr_t)
{
return os << "nullptr"; //whatever you want nullptr to show up as in the console
}

这是解决问题的正确方法吗? operator<< 不是 C++11/STL 中的错误吗?没有为 nullptr_t 定义? C++14/17 是否需要修复?或者它是故意的(因此一个人对 operator<< 的私有(private)定义可能有陷阱)?

最佳答案

这是 LWG #2221 ,建议:

The obvious library solution is to add a nullptr_toverload, which would be defined something like

template<class C, class T>
basic_ostream<C, T>& operator<<(basic_ostream<C, T>& os, nullptr_t)
{
return os << (void*) nullptr;
}

We might also consider addressing this at a core level: add a special-case language rule that addresses all cases where you write f(nullptr) and f is overloaded on multiple pointer types. (Perhaps a tiebreaker saying that void* is preferred in such cases.)

它不在 C++14 中,我不知道它是否会进入 C++17。这是一个非常容易解决的问题,因此就标准更改而言,它的优先级不是特别高。正如您在问题中所说的那样 - 它只是一个 3 行函数。

关于c++ - nullptr 的运算符 <<(流输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31164961/

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