知道为什么这个用户定义的文字会失败吗?
Any idea why this user defined literals fails?
我有以下实现 adler32 校验和的代码:
constexpr uint32_t adler32(std::string_view sv)
{
constexpr const uint32_t MOD_ADLER= 65521;
uint32_t rv= 0, a= 1, b= 0;
for (unsigned char c:sv)
{
a= (a+c)%MOD_ADLER;
b= (b+a)%MOD_ADLER;
}
rv= a|(b<<16);
return rv;
}
//----------------------------------------------------
constexpr uint16_t operator ""_csum(const char* str,long unsigned len)
{
return adler32(std::string_view(str,len));
}
和以下测试例程:
#include "adler32.h"
using easyUtils::operator""_csum;
#include <iostream>
using namespace std;
int main()
{
auto i= easyUtils::adler32("hello");
auto j= "hello"_csum;
auto k= easyUtils::adler32("hello");
cout << i << '\t' << j << '\t' << k << endl;
return 0;
}
在 Linux 下使用 clang 或 g++ 为 std=c++17
编译时给出以下输出:
./test/adlerTest
103547413 533 103547413
我本以为 103547413 是 3 次。知道为什么不是这样吗?
constexpr uint16_t operator ""_csum
^^
和
103547413L % 65536L == 533L
我有以下实现 adler32 校验和的代码:
constexpr uint32_t adler32(std::string_view sv)
{
constexpr const uint32_t MOD_ADLER= 65521;
uint32_t rv= 0, a= 1, b= 0;
for (unsigned char c:sv)
{
a= (a+c)%MOD_ADLER;
b= (b+a)%MOD_ADLER;
}
rv= a|(b<<16);
return rv;
}
//----------------------------------------------------
constexpr uint16_t operator ""_csum(const char* str,long unsigned len)
{
return adler32(std::string_view(str,len));
}
和以下测试例程:
#include "adler32.h"
using easyUtils::operator""_csum;
#include <iostream>
using namespace std;
int main()
{
auto i= easyUtils::adler32("hello");
auto j= "hello"_csum;
auto k= easyUtils::adler32("hello");
cout << i << '\t' << j << '\t' << k << endl;
return 0;
}
在 Linux 下使用 clang 或 g++ 为 std=c++17
编译时给出以下输出:
./test/adlerTest
103547413 533 103547413
我本以为 103547413 是 3 次。知道为什么不是这样吗?
constexpr uint16_t operator ""_csum
^^
和
103547413L % 65536L == 533L