lig*_*ulb 11 c++ templates visual-c++ non-type c++17
我不确定这是否是编译器错误,还是不确定我是否做了违反标准的操作而导致未定义的行为。这是我的代码:
#include <iostream>
template<auto InputSize, typename SizeType = decltype(InputSize)>
class StaticArray
{
public:
using size_type = SizeType;
using size_type2 = decltype(InputSize);
};
int main()
{
//StaticArray<2, int> s1;
StaticArray<2ull, int> s3;
std::cout << typeid(decltype(s3)::size_type).name() << "\t" << typeid(decltype(s3)::size_type2).name() << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果注释掉的行仍然被注释掉,我将得到正确的输出:int unsigned __int64。但是,如果取消注释该行,则会得到输出int int。作为参考,我正在MSVC 2017 v15.9.2的x86调试中对此进行编译。
它看起来像是编译器错误,请参阅https://godbolt.org/z/k2ng-1。如果MSVC的版本小于或等于19.16,则您会遇到问题,从19.20开始,一切正常。
编辑:在测试代码下面,将来链接应该断开:
#include <type_traits>
template<auto InputSize, typename SizeType = decltype(InputSize)>
class StaticArray
{
public:
using size_type = SizeType;
using size_type2 = decltype(InputSize);
};
int main()
{
StaticArray<2, int> s1;
StaticArray<2ull, int> s3;
static_assert(std::is_same_v<decltype(s3)::size_type, int>, "ERROR 1");
static_assert(std::is_same_v<decltype(s3)::size_type2, unsigned long long>, "ERROR 2");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |