只是一个我在使用 stl 时发现有趣的问题。在下面的代码中,主函数中的最后两行将导致错误(在注释中指出)。但是, test_func 编译得很好。由于传递给模板函数的类型是引用类型,并且函数本身应用了 & 运算符,这两件事本质上不一样吗?好吧,显然不会导致其中一个编译而另一个不编译。有谁知道为什么?
class File {
private:
std::string name_;
public:
File(std::string n) : name_(n) {}
std::string name() const { return name_; }
};
std::ostream& operator<<(std::ostream& os, const File& f)
{
os << f.name();
return os;
}
template <class T> void test_func(const T& v)
{
T& v1(v);
std::cout << "File:" << v1 << std::endl;
}
typedef File& FileRef;
int main(int argc, char* argv[])
{
File f("test_file");
test_func<File&>(f);
// FileRef& fRef1(f); ==> error; cannot declare reference to 'class File&'
// File&& fRef2(f); ==> error; expected unqualified-id before '&&' token
}
更新:我在使用 bind1st 和 bind2nd 函数时遇到了这个问题;它们的定义就像教科书中的 test_func 一样(第 18 章关于活页夹的部分中的 stroustrup),所以它不会出错。