【问题标题】:Template function returning a const template type返回 const 模板类型的模板函数
【发布时间】:2012-08-29 02:16:50
【问题描述】:

为什么以下不会产生编译器错误?

template<typename T>
const T testFunc()
{
    return T();
}

float* ptr = testFunc<float*>(); // ptr is not const - should be a compiler error!

在这个例子中,testFunc() 应该返回一个常量 float*,所以当我尝试将它分配给一个非常量 float* 时不应该出现编译器错误吗?

【问题讨论】:

    标签: c++ templates pointers constants


    【解决方案1】:

    您的期望是错误的,返回的 指针 将是 const,而不是指向的对象。专业化相当于:

    float * const testFunc<float*>();
    

    而不是:

    float const * testFunc<float*>();
    

    在您的示例中,调用端的代码是从 const 指针复制到非 const 指针,这很好。

    【讨论】:

    • 那如何让模板函数返回一个常量指针呢?
    • @jlanisdev:这取决于,您可以考虑的最简单的事情是将模板重写为:template &lt;typename T&gt; T const * testFunc();。调用站点将通过float:float const * ptr = testFunc&lt;float&gt;();。请注意,const T*T const * 是等价的,但后者更一致 用于解析人类——即如果你总是在右边添加const,那么在问题中很明显原始模板没有返回指向 const 的指针:template &lt;typename T&gt; T const testFunc()T == float* ==> float* const testFunc()
    • 但是,在原始示例中,我没有在右侧添加 const。我将它添加到左边,所以如果你简单地将“T”替换为“float*”,你会得到:“const float*”。我有点明白你想说什么,但对我来说,我如何解释它比编译器实际在做什么更有意义。
    • @jlanisdev:不,那是你错的地方。 const 应用于 Tconst TT const 是完全等价的。在评论中,我建议 youconst 写在右边,因为这样可以减少混乱。 const TT const 相同,T == float* 表示 float* const。我的建议是,如果您习惯将const 写在右边,那么编译器对表达式所做的解析更接近 文本替换,因此对 您来说更容易 理解(注意Ttypedef 都不是文本替换)
    • 这看起来非常不直观。我想我将来必须牢记这一点(我想我一直假设文本替换,这是我的问题)。
    猜你喜欢
    • 2022-01-16
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多