我试图理解为什么编译器在这里抱怨:
// cexpr_test.cpp
#include <initializer_list>
constexpr int test_cexpr(std::initializer_list<const char*> x)
{
return (int) (*x.begin())[0]; // ensuring the value isn't optimized out.
}
int main()
{
constexpr int r1 = test_cexpr({ "why does this work," });
constexpr std::initializer_list<const char*> broken { "but this doesn't?" };
constexpr int r2 = test_cexpr(broken);
return r1 + r2;
}
Run Code Online (Sandbox Code Playgroud)
编译时产生的消息
g++ -std=c++11 -Wall -Werror cexpr_test.cpp
Run Code Online (Sandbox Code Playgroud)
如下:
cexpr_test.cpp:在函数“int main()”中:cexpr_test.cpp:12:76:错误:“const std::initializer_list{((const char* const*)(&)), 1}”不是常量表达式 12 | constexpr std::initializer_list 损坏 {“但这不是?” }; |
令人困惑的是,为什么它在没有任何问题的情况下构建第一个初始化列表。我在这里缺少什么?
c++ string-literals initializer-list language-lawyer constexpr
我试图围绕Win32 API,并在创建窗口时得到不一致的结果.对CreateWindowEx的调用将失败,结果将GetLastError()
产生ERROR_NOT_ENOUGH_MEMORY
错误代码.但有时应用程序成功创建窗口并运行正常.这让我很困惑.
// Standard Includes
#include <windows.h>
#include <iostream>
#ifndef UNICODE
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
#define UNUSED_PARAM(x) (void)(x)
const char szWindowClass[] = "Program";
const char szTitle[] = "Program Desc";
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
UNUSED_PARAM(hPrevInstance);
UNUSED_PARAM(lpCmdLine);
WNDCLASSEX wcex;
HWND hWnd;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.hInstance = …
Run Code Online (Sandbox Code Playgroud)