我已经开始阅读C++模板-- Josuttis和Vandevoorde的完整指南。我狭小的大脑被卡住了。
作者指出,“您应该将您的更改限制在参数数量或显式指定模板参数上”,并以此作为导致问题的示例:
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
// maximum of two C-strings
inline char const* const& max( char const* a, char const* b)
{
return std::strcmp(a, b) < 0 ? b : a;
}
template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
return max( max(a,b), c);
}他们说使用max的3参数版本是一个错误-
const char * s1 = "fred";
const char * s2 = "anica";
const char * s3 = "lucas";
::max(s1, s2, s3); // ERROR因为对于C字符串,max(a,b)会创建一个新的临时本地值,该值可由函数通过引用返回。但我编译并运行得很好。
谁能解释一下作者在这个例子中说的是什么?
发布于 2010-11-02 06:58:49
问题是,“最多两个C字符串”的重载通过值接受两个参数,但随后返回对其中一个参数的引用。返回对局部变量的引用是一个坏主意(一旦局部变量在函数返回时被销毁,该引用就不能被使用,因此它是无用的)。
你可以通过常量引用获取两个const char*来修复它:
char const* const& max( char const* const& a, char const* const& b)原始版本可能会编译,但如果使用从调用max返回的值(确实如此,因为在调用max(max(a,b),c)时使用max(a,b)的结果),则行为是未定义的(因为您使用的是已销毁的对象)。
发布于 2010-11-02 06:57:30
你没有引用a和b。通过引用返回其中之一意味着返回对一个参数的引用,该参数是堆栈上的一个局部变量。
发布于 2010-11-02 06:57:07
我不确定他们想说什么,因为我看不出它如何创建一个临时局部变量,但是使用带有C字符串的模板可能会以其他不寻常的方式失败,例如不同长度的数组之间的差异,char数组和char*之间的差异,等等。
对于这些问题,http://codeidol.com/cpp/cpp-templates/Tricky-Basics/Using-String-Literals-as-Arguments-for-Function-Templates/可以作为一个很好的参考。
https://stackoverflow.com/questions/4073723
复制相似问题