C++ 模板歧义

标签 c++ templates grammar

我和一个 friend 正在讨论 C++ 模板。他问我这应该做什么:

#include <iostream>

template <bool>
struct A {
    A(bool) { std::cout << "bool\n"; }
    A(void*) { std::cout << "void*\n"; }
};

int main() {
    A<true> *d = 0;
    const int b = 2;
    const int c = 1;
    new A< b > (c) > (d);
}

main 中的最后一行有两个合理的解析。 'b' 是模板参数还是 b > (c) 模板参数?

虽然编译它很简单,看看我们得到了什么,但我们想知道是什么解决了歧义?

最佳答案

据我所知,它会被编译为 new A<b>(c) > d .这是解析它恕我直言的唯一合理方法。如果解析器在正常情况下不能假定 > 结束模板参数,那将导致更多的歧义。如果你想要另一种方式,你应该写:

new A<(b > c)>(d);

关于C++ 模板歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52506/

相关文章:

c++ - 全特化模板类没有外线虚方法定义

c++ - 当模板有默认参数时省略尖括号

c - C 中的 "for"循环后面是否需要 "{}"?

sql - 为什么SQL的语法是由内而外的?

c++类模板特化,无需重新实现一切

c++ - 更改构造函数中的初始化顺序

c++ - g++ 预处理器输出

c++ - 虚幻引擎 4 空白模块

c++ - 如何 enable_if 具有可变模板参数的类?

parsing - 我的Bison语法产生语法错误