【问题标题】:defining a variable as auto restrict将变量定义为自动限制
【发布时间】:2013-06-25 18:39:00
【问题描述】:

据我了解restrict,它将指针标记为对函数中特定数据的唯一引用。我经常看到它用在函数参数中,但这似乎也是有益的:

char *restrict a = get_some_string( );
char *restrict b = get_some_other_string( );

(因此编译器知道更改a 永远不会更改b,并且可以进行额外的优化)。

如果get_some_string返回一个很复杂的类型,似乎最好使用auto关键字;

auto a = get_some_string( );
auto b = get_some_other_string( );

但是使用auto restrict 会触发错误“restrict requires a pointer”。那么,我该如何结合这些呢?


如 cmets 中所述,restrict 不是 C++ 中的标准关键字;我忘记了我的项目中有一个 #define restrict __restrict__ 行,它适用于 GCC。

【问题讨论】:

  • decltype( get_some_string( ) ) restrict a = get_some_string( );?虽然 decltype 的行为略有不同。
  • 替代建议:使用typedef,而不是typedef
  • @JohnDibling typedefs 是我以前使用的。但我正在努力跟上时代的步伐并简化我的代码!
  • @indeterminatelysequenced 似乎有同样的问题; “限制需要一个指针”
  • @Dave:我个人不是auto 的忠实粉丝,因为在我看来,滥用和语义模糊的可能性很大。其他人会不同意。

标签: c++ c++11 auto restrict-qualifier


【解决方案1】:

由于 cmets 已经提出了某种解决方案,我将在此处发布以供将来参考; (增加了使其健壮的功能)

typename std::remove_reference<decltype(get_some_string()[0])>::type *restrict a = get_some_string( );

这太可怕了。在这些情况下,我会坚持使用typedefs,但我可以想象在某些情况下可能需要这样的行为。有了宏,它就变得不那么可怕了:

#define decltype_restrict(x) typename std::remove_reference<decltype((x)[0])>::type *restrict
decltype_restrict(get_some_string()) a = get_some_string( );

【讨论】:

  • 出于好奇,为什么用decltype(x[0]) 而不是decltype(*x)std::remove_pointer&lt;decltype(x)&gt;
  • @Angew 没有理由。 [0] 只是我想到的第一件事。 remove_pointer 可能是最好的选择。
猜你喜欢
  • 2011-08-10
  • 2022-01-19
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多