指向int和char*常量的悬空指针/引用 我正在阅读一本关于VC++的书,是VoDeoOrdE,JoutTube和Gregor,不理解他们对悬空引用的警告。 代码如下: #include <cstring> // maximum of two values of any type (call-by-reference) template<typename T> T const& max (T const& a, T const& b) { return b < a ? a : b; } // maximum of two C-strings (call-by-value) char const* max (char const* a, char const* b) { return std::strcmp(b,a) < 0 ? a : b; } // maximum of three values of any type (call-by-reference) template<typename T> T const& max (T const& a, T const& b, T const& c) { return max (max(a,b), c); // error if max(a,b) uses call-by-value } int main () { auto m1 = ::max(7, 42, 68); // OK char const* s1 = "frederic"; char const* s2 = "anica"; char const* s3 = "lucas"; auto m2 = ::max(s1, s2, s3); // run-time ERROR }

指向int和char*常量的悬空指针/引用 我正在阅读一本关于VC++的书,是VoDeoOrdE,JoutTube和Gregor,不理解他们对悬空引用的警告。 代码如下: #include <cstring> // maximum of two values of any type (call-by-reference) template<typename T> T const& max (T const& a, T const& b) { return b < a ? a : b; } // maximum of two C-strings (call-by-value) char const* max (char const* a, char const* b) { return std::strcmp(b,a) < 0 ? a : b; } // maximum of three values of any type (call-by-reference) template<typename T> T const& max (T const& a, T const& b, T const& c) { return max (max(a,b), c); // error if max(a,b) uses call-by-value } int main () { auto m1 = ::max(7, 42, 68); // OK char const* s1 = "frederic"; char const* s2 = "anica"; char const* s3 = "lucas"; auto m2 = ::max(s1, s2, s3); // run-time ERROR },c++,pointers,reference,dangling-pointer,C++,Pointers,Reference,Dangling Pointer,给定的消息是,对于C字符串,嵌套的maxa,b创建了一个悬空引用,而对于int的则没有。 那么,与int的引用相比,指向char的指针有什么特别之处呢,因为两者都是作为指向分配给max函数之外的对象的指针实现的 。。。不理解他们关于悬挂参考的警告 ::maxs1、s2、s3使用模板T const&max T const&a、T const&b、T const&c返回引用 如果模板T常量和最大T常量和a、T常量和b、T常量和c的定义更改为: template<typename T> T

给定的消息是,对于C字符串,嵌套的maxa,b创建了一个悬空引用,而对于int的则没有。 那么,与int的引用相比,指向char的指针有什么特别之处呢,因为两者都是作为指向分配给max函数之外的对象的指针实现的

。。。不理解他们关于悬挂参考的警告

::maxs1、s2、s3使用模板T const&max T const&a、T const&b、T const&c返回引用

如果模板T常量和最大T常量和a、T常量和b、T常量和c的定义更改为:

template<typename T>
T const& max (T const& a, T const& b, T const& c)
{
  return (a > b) ? ((a > c) ? a : c)
                 : ((b > c) ? b : c);
}
或者将其定义为

char const* const & max (char const* const & a, char const* const & b)
{
  return  std::strcmp(b,a) < 0  ? a : b;
}
。。。不理解他们关于悬挂参考的警告

::maxs1、s2、s3使用模板T const&max T const&a、T const&b、T const&c返回引用

如果模板T常量和最大T常量和a、T常量和b、T常量和c的定义更改为:

template<typename T>
T const& max (T const& a, T const& b, T const& c)
{
  return (a > b) ? ((a > c) ? a : c)
                 : ((b > c) ? b : c);
}
或者将其定义为

char const* const & max (char const* const & a, char const* const & b)
{
  return  std::strcmp(b,a) < 0  ? a : b;
}
这:

返回一个无名的临时指针值,然后执行以下操作:

    return max (max(a,b), c);
返回对它的引用。

此:

返回一个无名的临时指针值,然后执行以下操作:

    return max (max(a,b), c);

返回一个引用。

    return max (max(a,b), c);