使用decltype获取表达式的类型,不使用const

Jim*_*son 36 c++ decltype c++11

考虑以下程序:

int main ()
{
    const int e = 10;

    for (decltype(e) i{0}; i < e; ++i) {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

这无法使用clang(以及gcc)进行编译:

decltype.cpp:5:35: error: read-only variable is not assignable
    for (decltype(e) i{0}; i < e; ++i) {
                                  ^ ~
Run Code Online (Sandbox Code Playgroud)

基本上,编译器假设i必须是const,因为e是.

有没有办法可以decltype用来获取类型e,但删除说明const符?

zch*_*zch 39

用途std::remove_const:

#include<type_traits>
...
for (std::remove_const<decltype(e)>::type i{0}; i < e; ++i)
Run Code Online (Sandbox Code Playgroud)

  • 或者`std :: remove_const_t <decltype(e)> i {0}`和C++ 14 (20认同)

Cas*_*sey 33

我更喜欢auto i = decltype(e){0};这个.它比使用更简单type_traits,我觉得它更明确地指定了你想要一个变量初始化为0 e的类型的意图.

我最近一直在使用Herb的"AAA风格",所以它可能只是偏向于我.

  • 这是极好的。它用简洁的语法回答了我所追求的真正问题。 (2认同)

kla*_*aus 6

您还可以使用std::decay:

#include<type_traits>
...
for (std::decay<decltype(e)>::type i{}; i < e; ++i) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

  • 应该是`typename std::decay&lt;decltype(e)&gt;::type`。C++14 添加了一个别名来缩短它,`std::decay_t&lt;decltype(e)&gt;` (2认同)

M.M*_*M.M 5

尚未提及的解决方案:

for (decltype(+e) i{0}; i < e; ++i)
Run Code Online (Sandbox Code Playgroud)

原始类型的Prvalue已const删除;所以+e是类型的prvalue,int因此decltype(+e)int