C++ 代码使用clang编译,但不使用gcc
我有一段代码,可以用clang(甚至是-Weverything)编译,但是gcc会为其发出一个错误C++ 代码使用clang编译,但不使用gcc,c++,gcc,clang,C++,Gcc,Clang,我有一段代码,可以用clang(甚至是-Weverything)编译,但是gcc会为其发出一个错误 #include <iostream> #include <vector> #include <fstream> using namespace std; class PhonebookWriter { public: PhonebookWriter(const string& fname): fname_(fname), names_
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
class PhonebookWriter
{
public:
PhonebookWriter(const string& fname):
fname_(fname), names_(), numbers_() {}
PhonebookWriter& operator()(const string& name,
const string& number)
{
names_.push_back(name);
numbers_.push_back(number);
return *this;
}
~PhonebookWriter(void)
{
ofstream f(fname_.c_str());
for(size_t i=0;i<names_.size();++i)
f << names_[i] << " " << numbers_[i] << "\n";
f.close();
}
private:
const string fname_;
vector<string> names_;
vector<string> numbers_;
};
namespace {
void write_guests_data(const string& fname)
{
PhonebookWriter(fname)("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
}
}
int main(void)
{
write_guests_data("phone_book.txt");
return 0;
}
我的gcc版本是4.9.1,我的clang版本是3.5.0。
我不明白为什么会有阴影问题。即使有,它也应该被叮当声捡起。改变:
PhonebookWriter(fname)("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
致:
解释
出于某种原因,gcc删除了fname
周围的大括号,这将行变成:
PhonebookWriter fname ("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
现在这些错误是有意义的。您能解决阴影问题,使两个编译器都满意吗?或者您是说您根本不理解错误消息?这似乎被解释为
PhonebookWriter fname(“Mr Foo Bar”,“12345”)
,即本地实例的声明。您可以使用一个临时的或命名的工厂函数来解决这个问题,甚至只需在PhonebookWriter(fname)
上加一对括号就可以了。是的,我可以在这个特定的示例中解决阴影问题。然而,我不明白为什么首先会出现问题,以及为什么不同的编译器对代码的响应不同。我试图首先避免使用临时变量。添加额外的括号就成功了。谢谢。关于潜在问题的线程:
(PhonebookWriter(fname))("Mr Foo Bar","12345")("Mrs Bar Foo","54321");
PhonebookWriter fname ("Mr Foo Bar","12345")("Mrs Bar Foo","54321");