【问题标题】:What is const void?什么是常量无效?
【发布时间】:2016-10-19 06:32:12
【问题描述】:

std::is_void 的描述表明:

提供等于true的成员常量值,如果T是类型void, const void, volatile void, 或 const volatile void。

那么const voidvolatile void 可能是什么?

This answer 声明 const void 返回类型无效(但在 VC++ 2015 上编译)

const void foo() { }

如果按照标准,const void 是无效的(VC 是错误的) - 那么const void 是什么?

【问题讨论】:

  • 您链接到的答案并没有说明它是无效的,它表明它将是“毫无意义的”,我认为这意味着“与void 相比没有任何好处没有const"。
  • @hvd,答案表明编译器应该警告/错误关于这种资格。据此,我认为 C++ 标准不允许使用 void
  • 答案指出编译器应该警告这种限定,它没有提到错误,并且错误是错误的。那句话只是关于实现的质量,而不是关于一致性,但我可以理解,从评论本身来看,这一点都不清楚。
  • @Ajay 标准未指定在您使用无意义的代码时应发出警告。 gcc 决定给你一个额外的提示,即这段代码没有做任何事情。但 VC 无论如何都没有错。
  • @Ajay 答案表明 clang 会发出警告,并且在作者看来,其他编译器应该这样做。如果标准不允许,那将是错误,而不是警告。

标签: c++ c++11 c++14


【解决方案1】:

const void 是一种可以形成指针的类型。它类似于普通的 void 指针,但转换的工作方式不同。例如,const int* 不能隐式转换为void*,但可以隐式转换为const void*。同样,如果您有 const void*,则不能将 static_cast 发送到 int*,但您可以将 static_cast 发送到 const int*

const int i = 10;
void* vp = &i;                           // error
const void* cvp = &i;                    // ok
auto ip = static_cast<int*>(cvp);        // error
auto cip = static_cast<const int*>(cvp); // ok

【讨论】:

  • 虽然你的答案很好,但它并没有说明const void 的原因,而是围绕着 void 和 non-void 指针 [ with (non-)const-ness ]。
  • @Ajay:我不同意。 const void* 是您看到 const void 的唯一原因。它可以作为模板参数传递,但该参数类型只会在其末尾以 * 实例化。
  • @BenjaminLindley 您还可以在question asked by language lawyer 中看到const void
  • @Ajay:在某些时候,这个问题变成了哲学问题。 const void的“原因”是C++中的所有类型都可以做成const。它以与void 相同的方式“存在”。 @Benjamin Lindley 的回答通过您看到它的方式以及您如何使用它来解释它是什么。
【解决方案2】:

作为voidconst void 是一个空类型。但是,如果 const voidreturn 类型,则 const 没有意义(尽管合法!),因为 [expr]/6:

如果纯右值最初的类型为“cvT”,其中T 是无 cv 限定的非类、非数组类型,则 在进行任何进一步分析之前,将表达式调整为 T

但是,它本身是一个有效的类型,并且出现在例如C-standard library functions,用于确保参数指针的 const 正确性:int const* 不能转换为 void*,但 void const*

【讨论】:

  • const void 作为返回类型确实会影响函数类型,所以也不是完全没有意义。
  • @cpplearner 除了在实际意义上,因为函数的 签名 和调用的类型都不会受到影响。
  • 它可以改变函数模板的签名。 +1 仍然
  • @cpplearner 很公平——尽管如此,它仍然是在浪费按键。
  • 我们通常看到:const int *不能去void *,但是const void *。
【解决方案3】:

类型可以是模板的结果;模板可能声明 const T,并使用 T 实例化为 void

链接的答案被误导,或者更确切地说,因为它考虑到非模板类型的特殊情况,所以const void 可能是毫无意义,但它是有效代码。

【讨论】:

    猜你喜欢
    • 2016-07-15
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2016-02-13
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多