msc*_*msc 38 c++ linker-errors extern c++17 if-constexpr
我已经在C++ 17编译器(Coliru)中编译并运行了以下程序.在程序中,我声明了一个extern变量,但没有定义它.但是,编译器不会给出链接器错误.
#include <iostream>
extern int i; // Only declaration
int func()
{
if constexpr (true)
return 0;
else if (i)
return i;
else
return -1;
}
int main()
{
int ret = func();
std::cout<<"Ret : "<<ret<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器没有给出链接器错误?
Sto*_*ica 58
因为变量不是使用odr.你有一个constexpr if总是丢弃可以使用它的分支.
其中一个要点constexpr if是丢弃的分支甚至不需要编译,只需要格式良好.这就是我们如何在一个被丢弃的分支中调用不存在的成员函数.
AnT*_*AnT 41
在您的情况下,变量仅用于废弃的语句中.但是,即使我们忽略了这一事实,C++语言规范仍然明确指出缺少定义不需要诊断
3.2单一定义规则
4每个程序应包含在废弃陈述之外的该程序中使用的每个非内联函数或变量的一个定义(6.4.1); 无需诊断.
语言规范理解优化编译器可能足够智能以消除变量的所有odr使用.在这种情况下,要求实施检测和报告潜在的ODR违规将是过分和不必要的.
因为编译器会产生编译器错误,链接器会产生链接器错误......
不,认真:
if constexpr (true)
Run Code Online (Sandbox Code Playgroud)
始终为true,因此编译器会忽略if子句的其余部分,因为它永远不会到达.所以i从来没有使用过.
| 归档时间: |
|
| 查看次数: |
3695 次 |
| 最近记录: |