gpt4 book ai didi

C++ 直接嵌套引用 vs 通过模板参数

转载 作者:行者123 更新时间:2023-11-30 04:17:29 29 4
gpt4 key购买 nike

只是一个我在使用 STL 时发现有趣的问题。在下面的代码中,main 函数中的最后两行将导致错误(在注释中指出)。但是, 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 章绑定(bind)器部分中的 stroustrup),所以它不会错。

最佳答案

第一行注释是合法的,您的编译器可能不符合 C++11。由于 C++11 的引用折叠规则,实际上,它应该声明一个名为 fRef1File 左值引用,并将其绑定(bind)到左值 f.

第二行注释是非法的:您不能将右值引用绑定(bind)到左值。但是,您收到的错误似乎表明编译器不理解 && 标记。

如果您使用的是 Clang 或 GCC,请确保使用 -std=c++11-std=c++0x 选项进行编译。

更新:

在C++03中,这两行都是非法的,甚至这个函数调用也应该被编译器拒绝:

test_func<File&>(f); // SHOULD BE AN ERROR! (substitution failure)

根据 C++03 标准的第 14.8.2/2 段:

[...] Type deduction may fail for the following reasons:

— [...]

Attempting to create a reference to a reference type or a reference to void.

— [...]

这可能意味着两件事:要么你的编译器有错误,要么它故意决定忽略在模板参数推导的上下文中创建对引用的引用的尝试(并且仅在该上下文中) - 这意味着你处理编译器扩展。

无论如何,该函数调用的格式不正确,因此不可移植。

关于C++ 直接嵌套引用 vs 通过模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17071686/

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