我希望对那些尝试过C ++ 20模块的人来说是一个简短的问题
根据TS,此代码应在C ++ 20中编译吗?
void f1() { f2(); }
void f2() { ... }
例如,在C ++ 11中它将不会编译,因为f1()并不“了解” f2(),因此必须在使用前声明f2()。
但是也许在C ++ 20中,此要求将在模块中消除?
如果第一个代码段未编译,则将其编译
void f1() { f2(); }
export void f2() { ... }
因为从BMI中可以看到f2()?
答案 0 :(得分:6)
虽然模块确实改变了许多有关名称查找的内容(我知道的最新论文是P1103R1),但是模块不会改变C ++的基本属性,即必须在使用之前声明名称(诸如模不合格的呼叫-只是延迟了查找,但实际上仍必须进行。)
此:
void f1() { f2(); }
export void f2() { ... }
如果没有先前的f2
声明或不是从某个地方导入的,仍将是编译错误。您必须写:
export void f2() { ... }
void f1() { f2(); }