为什么我不能通过模板参数声明一种友元函数,但可以使用别名

时间:2017-10-03 20:04:17

标签: c++ templates friend

考虑代码:

template <class T>
class Bar {
    int foobar;
    using X = T();
    friend X foo;
};

void foo() {
    Bar<void> bar;
    bar.foobar = 1;
    static_cast<void>(bar);
}

int main() {}

gccclang中编译正常。但看似相同的代码:

template <class T>
class Bar {
    int foobar;
    friend T foo;
};

void foo() {
    Bar<void()> bar;
    bar.foobar = 1;
    static_cast<void>(bar);
}

int main() {}

会导致gccclang出错。为什么模板参数在这里不等效于别名?

1 个答案:

答案 0 :(得分:1)

因为grep "\..*\." *.txt 被解析为对象的声明,并且模板的实例化不能将对象的声明更改为函数的声明。

C ++标准/ [temp.spec]:

  

如果函数声明通过依赖类型(17.7.2.1)获取其函数类型而不使用   函数声明器的句法形式,程序格式不正确。