【发布时间】:2020-04-21 20:03:03
【问题描述】:
如果一个函数参数被注释const int &x 并且我尝试在函数体中执行x++,我会收到一个用于修改只读引用的编译时错误。但是如果我像这样使用__restrict__ 修饰符:
void foo(int & __restrict__ a, int & __restrict__ b) {
if (a == 1)
b = 2;
if (a == 2)
b = 3;
}
int main() {
int x = 1;
foo(x, x); // should be illegal?
cout << x;
}
...我没有收到编译时错误。如果我在未优化的情况下运行此代码,则输出为3,但如果我使用-O1 或更高版本运行它,则输出为2。似乎检测x 被通过两次会很简单,也很容易被禁止。为什么 C++ 可以防止对 const 的不当使用,但对__restrict__ 的不当使用却没有?
【问题讨论】:
-
这是未定义的行为。我只是不确定是否可以发布答案,因为我很难找到 C++ 的正确参考
-
请注意,C++ 并没有对
__restrict__做任何事情,因为它是一个实现扩展。
标签: c++ pass-by-reference restrict-qualifier