std::is_constructible<void()>::value 的正确结果是什么?
What is the correct result of std::is_constructible<void()>::value?
我得到std::is_constructible<void()>::value
不一致的结果。我对标准的解释是它应该是假的。然而,Clang在libc++和libstdc++*中都给出了true。GCC和MSVC都给出false。哪个结果是正确的?
给定以下函数声明:
template <class T> add_rvalue_reference_t<T> create() noexcept;
模板专门化的谓词条件满足
is_constructible<T, Args...>
当且仅当下面的变量定义对于某些发明来说是格式良好的变量t
:T t(create<Args>()...);
注意:本文与c++ 11 (N3485)略有不同,其中create
未标记为noexcept
。但是,考虑到这一点,我的测试结果并没有改变。
下面是我对类型特征和标准定义的最小测试用例:
#include <type_traits>
static_assert(std::is_constructible<void()>::value, "assertion fired");
template<typename T>
std::add_rvalue_reference_t<T> create() noexcept;
template<typename T, typename... Args>
void foo() {
T t(create<Args>()...);
}
int main() {
foo<void()>();
}
<标题>结果:Clang (HEAD, libc++):
- 静态断言已通过
foo<void()>
未编译Clang (HEAD, libstdc++)*:
- 静态断言已通过
foo<void()>
未编译GCC (HEAD, libstdc++):
- 静态断言失败
foo<void()>
未编译MSVC (version 19 via http://webcompiler.cloudapp.net/):
- 静态断言失败
-
foo<void()>
没有编译(需要注释掉静态断言)
* __GLIBCXX__
在Clang没有-stdlib
选项和-stdlib=libstdc++
选项时没有定义。我不确定是否libstdc++是实际上正在使用。如果我对标准的解释是正确的,那么我不确定这是Clang还是libc++的bug。
继续阅读。来自同一段:
访问检查就像在与
T
和无关的上下文中执行一样Args
中的任何一个。对象的当前上下文的有效性考虑变量初始化。 [备注:的实例化会导致副作用类模板特化和函数模板特化,隐式定义函数的生成等等。这样的方效果不在"直接上下文"中,并且可能导致程序格式错误。 -end note]
断言只有在模板构造函数实例化时才会失败。然而,正如在说明中澄清的那样,该断言并不在所考虑的变量定义的直接上下文中,因此不影响其"有效性"。因此,编译器可以认为该定义是有效的,即使实际上试图构造void()
会导致错误格式的程序。
请注意,编译器也可以根据断言拒绝原始程序,而不是让is_constructible产生false。
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- std::chrono::duration::count函数的实际结果类型是什么
- 术语的计算结果不是采用0个参数的函数
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- C++:术语的计算结果不是采用 1 个参数的函数
- ZTV,ZTS,ZTI 在 gdb x/nfu "vtable_address" 的结果中是什么意思?
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- 如何打印返回值的结果?我是一个初学者学习C++
- 即使在C 中越过初始化阵列的极限后,结果也是如此
- 使用FP:快速导致错误的VC 结果(不仅仅是不准确)结果 - 这是编译器错误
- 我收到此错误:错误 c2064:term 的计算结果不是采用 0 个参数的函数,但我不明白为什么
- C++时间()给我的结果几乎是随机的
- 三元运算符的结果不是右值
- 为什么"decltype(i+j)"的结果不是右值引用?
- 简单的代码,看似随机的结果——这是由于过时的引用造成的吗
- wxwidgets Bind()项的计算结果不是在event.h中使用1个参数的函数
- 我正在尝试用C++制作一个费用计算器,我得到了错误C2064:term的计算结果不是一个带1个参数的函数
- 取消引用无效指针但不使用结果是否是C++中的未定义行为
- 字符* 到字符串 c++(结果不是预期的)
- 错误C2064:术语的计算结果不是一个带1个参数的函数,我该如何克服这个错误