小编rob*_*.14的帖子

在编译时获取std :: array中的元素数

以下是有效的C++代码,为什么不呢?

std::array<std::string, 42> a1;
std::array<int, a1.size()> a2;
Run Code Online (Sandbox Code Playgroud)

它不能在GCC 4.8中编译(在C++ 11模式下).有一个简单但不优雅的解决方法:

std::array<std::string, 42> a1;
std::array<int, sizeof(a1)/sizeof(a1[0])> a2;
Run Code Online (Sandbox Code Playgroud)

很明显,编译器可以计算出std :: array中的元素数量.为什么std :: array :: size()不是constexpr static函数?

编辑:我找到了另一种解决方法:

std::array<std::string, 42> a1;
std::array<int, std::tuple_size<decltype(a1)>::value> a2;
Run Code Online (Sandbox Code Playgroud)

c++

28
推荐指数
2
解决办法
8123
查看次数

为什么包含<utility>会破坏GCC中的结构化绑定?

考虑:

struct Point { int x, y; };

int main()
{
    const auto [x, y] = Point{};
}
Run Code Online (Sandbox Code Playgroud)

这段代码在C++ 17模式下用gcc 7.1编译得很好,但是这个:

#include <utility>

struct Point { int x, y; };

int main()
{
    const auto [x, y] = Point{};
}
Run Code Online (Sandbox Code Playgroud)

给出错误:

bug.cpp: In function 'int main()':
bug.cpp:7:16: error: 'std::tuple_size<const Point>::value' is not an integral constant expression
     const auto [x, y] = Point{};
                ^~~~~~
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?一个编译器错误,或者这是结构化绑定应该如何工作?

c++ gcc c++17 structured-bindings gcc7

21
推荐指数
2
解决办法
897
查看次数

有没有办法阻止"关键字"在MS Visual Studio中高级语法

MS Visual Studio编辑器将一些非关键字标识符作为C++文件中的关键字突出显示.特别是"事件"和"数组"被视为关键字.这对我来说非常烦人,因为它们不是C++关键字.我知道如何将自己的关键字添加到语法突出显示的标识符列表中,但是如何删除现有的内置关键字?我知道这可能需要修补一些可执行文件.那么有谁知道如何做到这一点?

c++ visual-c++

10
推荐指数
2
解决办法
857
查看次数

peekCString和peekCStringLen是否懒惰?

我有一个C函数创建一个空终止字符串并返回一个指向它的指针,还有相应的释放函数.

foreign import ccall unsafe "get_str" getStr :: IO CString
foreign import ccall unsafe "free_str" freeStr :: CString -> IO ()
Run Code Online (Sandbox Code Playgroud)

我想从返回的CString创建一个Haskell字符串,并尽快释放CString.

do cStr <- getStr
   str <- peekCString cStr
   freeStr cStr
   -- here str is used
Run Code Online (Sandbox Code Playgroud)

在使用str之前释放cStr是否安全?换句话说,peekCString是否一次创建Haskell String,还是懒得创建?

haskell ffi lazy-evaluation

4
推荐指数
1
解决办法
257
查看次数