首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过载的模板参数-为什么这个例子是一个问题?

过载的模板参数-为什么这个例子是一个问题?
EN

Stack Overflow用户
提问于 2010-11-02 06:46:07
回答 4查看 377关注 0票数 3

我已经开始阅读C++模板-- Josuttis和Vandevoorde的完整指南。我狭小的大脑被卡住了。

作者指出,“您应该将您的更改限制在参数数量或显式指定模板参数上”,并以此作为导致问题的示例:

代码语言:javascript
复制
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参数版本是一个错误-

代码语言:javascript
复制
const char * s1 = "fred";
const char * s2 = "anica";
const char * s3 = "lucas";
::max(s1, s2, s3); // ERROR

因为对于C字符串,max(a,b)会创建一个新的临时本地值,该值可由函数通过引用返回。但我编译并运行得很好。

谁能解释一下作者在这个例子中说的是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-02 06:58:49

问题是,“最多两个C字符串”的重载通过值接受两个参数,但随后返回对其中一个参数的引用。返回对局部变量的引用是一个坏主意(一旦局部变量在函数返回时被销毁,该引用就不能被使用,因此它是无用的)。

你可以通过常量引用获取两个const char*来修复它:

代码语言:javascript
复制
char const* const& max( char const* const& a, char const* const& b)

原始版本可能会编译,但如果使用从调用max返回的值(确实如此,因为在调用max(max(a,b),c)时使用max(a,b)的结果),则行为是未定义的(因为您使用的是已销毁的对象)。

票数 3
EN

Stack Overflow用户

发布于 2010-11-02 06:57:30

你没有引用a和b。通过引用返回其中之一意味着返回对一个参数的引用,该参数是堆栈上的一个局部变量。

票数 1
EN

Stack Overflow用户

发布于 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/可以作为一个很好的参考。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4073723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档