【发布时间】:2018-03-21 03:18:32
【问题描述】:
Visual C++ 2017 干净编译如下,调用用户自定义的log:
// Source encoding: UTF-8 with BOM ∩
#include <algorithm> // std::for_each
#include <iostream>
#include <math.h> // ::(sin, cos, atan, ..., log)
#include <string> // std::string
void log( std::string const& message )
{
std::clog << "-- log entry: " << message << std::endl;
}
auto main()
-> int
{
auto const messages = { "Blah blah...", "Duh!", "Oki doki" };
std::for_each( messages.begin(), messages.end(), log ); // C++03 style.
}
我认为这是一个编译器错误,因为我设计代码是为了显示标识符如何由于与标准库的名称冲突而产生歧义。
这是编译器的错误吗?
补充信息:MinGW g++ 7.2 发出几条错误消息。它们并不完全提供信息,有 15 行抱怨 std::for_each,但显然它们是由于名称冲突造成的。更改log 的名称,代码编译得很好。
更新:进一步检查表明这显然是一个编译器错误,因为 Visual C++ 编译以下内容(除非定义了符号 D):
#include <cmath> // std::(sin, cos, atan, ..., log)
#include <string> // std::string
namespace my{ void log( std::string const& ) {} }
using std::log;
using my::log;
auto main()
-> int
#ifdef D
{ return !!log; }
#else
{ auto f = log; return f==my::log; }
#endif
Reported to Microsoft(新的 MS 错误报告方案非常错误:它认为将代码自动换行是个好主意,然后拒绝让我上传源代码文件,除非我给它一个“.txt”文件名扩展名)。
【问题讨论】:
-
我不确定为什么
Visual C++编译它。它如何区分您的log符号和来自math.h的符号? -
g++ 7.3在 linux 上给出了一个足够合理的错误“未解决的重载函数类型”。奇怪的是MinGW的行为不同。 -
@Galik:它确实在
std::for_each的呈现函数签名中提到了“未解决”。我怀疑 linux 上的所有错误都与std::for_each有关,而不是关于log的一条预先消息? -
math.h中的所有内容不是都可以实现为宏吗?如果log是一个调用别的东西的宏,那就没有歧义了。 -
@ArneVogel:演示可能相当于一篇更长的论文。但首先是关于实现合规性的部分,它将可诊断规则定义为所有句法和语义规则,除非明确标记为其他规则。然后它继续指出违反可诊断规则需要至少一条诊断消息。这减少了在标准中查找不允许模糊名称引用的特定点的问题。您可以确定它是,否则我们手头的标准存在缺陷。
标签: c++