小编Ale*_*c C的帖子

带有 std::initializer_list 的奇怪行为 constexpr

我试图理解为什么编译器在这里抱怨:

// 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

6
推荐指数
1
解决办法
426
查看次数

Win32不一致的CreateWindowEx调用

我试图围绕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)

c++ windows winapi

0
推荐指数
1
解决办法
142
查看次数