无法将const应用于typedef引用

时间:2016-02-11 23:32:34

标签: c++ const const-correctness

以下代码在将const应用于value_type&的返回值引用时有效,但如果我使用相同类型的typedef则会出错。

举个例子:

class T {
};

class A {
public:
    typedef T value_type;
    typedef value_type& reference;

    // Not working
    const reference operator*() const;

    // But this works?
    //const value_type& operator*() const;
};

// Error!
const typename A::reference A::operator*() const {
}

int main() {
    return 0;
}

g ++会出错:

'const' qualifiers cannot be applied

我的实际代码使用了模板,但我删除了示例并替换了类T。这与错误无关。

如果指定value_type&而不是编译好,我不明白为什么这不起作用。

2 个答案:

答案 0 :(得分:7)

这里有两个不同的问题。

首先,在:

typedef T* pointer;
typedef const pointer const_pointer;

const_pointer的类型实际上是T* const,而不是const T*。 constness附加到指针,而不是指向的类型。

现在引用遵循相同的逻辑:如果你为引用类型创建了一个typedef,并尝试将const附加到它,它将尝试将const应用于引用类型,而不是引用类型。但是,与指针不同,引用不允许具有顶级cv资格。如果您尝试提及T& const,则表示编译错误。但是如果你尝试通过typedef附加cv-qualification,那么它就会被忽略。

  

除非引入了cv限定符,否则Cv限定引用的格式不正确   通过使用 typedef-name (7.1.3,14.1)或* decltype-specifier *(7.1.6.2),在这种情况下使用cv-qualifiers   被忽略了。

([dcl.ref] / 1)

所以第二个问题是GCC认为这是一个错误,而标准明确指出它不应该是一个错误,它应该忽略const。我认为这是海湾合作委员会的一个错误。 Clang不会产生错误:http://coliru.stacked-crooked.com/a/5b5c105941066708

答案 1 :(得分:2)

您不能将const应用于引用,例如const(ref(type))。

但是你可以引用一个const类型,比如ref(const(type))。