Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果模板参数是指针,则在getter上删除常量限定符_C++_Templates_Pointers_Gcc - Fatal编程技术网

C++ 如果模板参数是指针,则在getter上删除常量限定符

C++ 如果模板参数是指针,则在getter上删除常量限定符,c++,templates,pointers,gcc,C++,Templates,Pointers,Gcc,我有以下代码: template <typename T> struct Val { T val; const T& get() const { return val; } void set(const T& newVal) { val = newVal; } }; int& f(const Val<int>& val) { return val.get(); } int* g(const Val<

我有以下代码:

template <typename T>
struct Val
{
    T val;

    const T& get() const { return val; }
    void set(const T& newVal) { val = newVal; }
};

int& f(const Val<int>& val)
{
    return val.get();
}

int* g(const Val<int*>& val)
{
    return val.get();
}

int main()
{
    Val<int> val1;
    f(val1);

    Val<int*> val2;
    g(val2);

    return 0;
}
模板
结构值
{
T值;
常量T&get()常量{return val;}
无效集(const T&newVal){val=newVal;}
};
内部和外部(const Val和Val)
{
返回val.get();
}
int*g(常数值和值)
{
返回val.get();
}
int main()
{
Val-val1;
f(val1);
Val val2;
g(val2);
返回0;
}
在gcc中编译失败,并显示以下消息:

main.cpp: In function 'int& f(const Val<int>&)':
main.cpp:78:20: error: invalid initialization of reference of type 'int&' from expression of type 'const int'
     return val.get();
                    ^
main.cpp:79:1: warning: control reaches end of non-void function [-Wreturn-type]
main.cpp:在函数“int&f(const Val&)”中:
main.cpp:78:20:错误:从“const int”类型的表达式初始化“int&”类型的引用无效
返回val.get();
^
main.cpp:79:1:警告:控件到达非无效函数的末尾[-Wreturn类型]
这很好,但是为什么不为
g()
生成相同的错误呢?由于某种原因,当
T
是指针时,为什么要删除
const T&
上的const限定符

我试图找到一些资源,但似乎很难找到。我知道梅耶斯在他的新书中写了一些东西,但我没有这本书。当
T
是一个指针时,有人能给我指一下资源或关键字,在那里我可以找到更多关于模板类型推断的主题吗

为什么,出于某种原因,当T是指针时,在const T&上删除了const限定符

因为指针是按值返回的,而不是按引用返回的。从常量指针初始化指针是完全正确的(请注意,指针是
常量
,而不是它们指向的对象)。您正在执行与此等效的操作:

int* const p0 = nullptr; // const pointer
int* p1 = p0;            // copy to non-const is OK
如果要从常量指针初始化对pointer的非开销引用,则会出现与第一种情况类似的错误:

// error: binding of reference to type 'int *'
// to a value of type 'int *const' drops qualifiers
int*& p1 = p; 

现在我明白了,当然。在
const T&
中,
const
保护的是整个
T
,而不是其中的值。@bobbel我真的不知道你的意思。对不起,是的。不重要。发现我的思维有错误。我希望
Val
Val
在内部
int
上具有相同的行为。