小编0x4*_*D18的帖子

将char数组转换为对象指针 - 这是UB吗?

我最近看到像这样的类用于"按需"构造对象,而不必出于各种原因使用动态内存分配.

#include <cassert>

template<typename T>
class StaticObject
{
public:
    StaticObject() : constructed_(false)
    {
    }

    ~StaticObject()
    {
        if (constructed_)
            ((T*)object_)->~T();
    }

    void construct()
    {
        assert(!constructed_);

        new ((T*)object_) T;
        constructed_ = true;
    }

    T& operator*()
    {
        assert(constructed_);

        return *((T*)object_);
    }

    const T& operator*() const
    {
        assert(constructed_);

        return *((T*)object_);
    }

private:
    bool constructed_;
    alignas(alignof(T)) char object_[sizeof(T)];
};
Run Code Online (Sandbox Code Playgroud)

这段代码,即将正确对齐的char数组转换为对象指针,被C++ 14标准视为未定义的行为,还是完全没问题?

c++ pointers undefined-behavior c++14

7
推荐指数
2
解决办法
656
查看次数

从基础类型安全地转换枚举类

假设我有一个像这样的强类型枚举类型:

enum class message : int {
    JOIN = 0,
    LEAVE = 4,
    SPAWN = 1,
}
Run Code Online (Sandbox Code Playgroud)

我需要安全地(在这种情况下,安全地意味着丢弃无效的变体)将其从其基础类型(int)进行转换。

为此,我有一个函数可以将其转换为我:

std::optional<message> get_message(int num) {
    return num == (int)message::JOIN || num == (int)message::LEAVE || num == (int)message::SPAWN ? (message)num : {};
}
Run Code Online (Sandbox Code Playgroud)

这是可行的,但是编写起来很长并且容易出错,尤其是对于具有大量变体的枚举。

有没有办法在C ++ 17中自动执行此过程?

c++ enums integer c++17

7
推荐指数
1
解决办法
116
查看次数

使用 mem::size_of::&lt;T&gt; 作为数组长度时,在编译时无法知道类型为“T”的值的大小

考虑以下函数:

fn make_array<T>()
where
    T: Sized,
{
    let bytes = [0u8; std::mem::size_of::<T>()];
}
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,它都无法编译

fn make_array<T>()
where
    T: Sized,
{
    let bytes = [0u8; std::mem::size_of::<T>()];
}
Run Code Online (Sandbox Code Playgroud)

尽管事实上Sized泛型参数有一个trait bound T。这对我没有任何意义。

为什么会发生这种情况,我该如何解决?

generics rust

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

PDO 一直连接到错误的 IP

当我尝试使用以下代码从 WAMP 服务器安装连接到我的外部服务器(允许外部连接)时:

const SERVER = 'xxx.xxx.xxx.xx'; // Redacted, the target servers IP
const PORT = 3306; 
const DATABASE = 'xxx'; // Redacted
const USERNAME = 'xxx'; // Redacted
const PASSWORD = 'xxx'; // Redacted
const TIMEOUT = 5;

try
{
    $pdo = new PDO('mysql:dbname=' . DATABASE . ';host=' . SERVER . ';port=' . PORT, USERNAME, PASSWORD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => TIMEOUT));
}
catch (PDOException $e)
{
    echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息: SQLSTATE[HY000] [1045] Access denied for user 'main'@'xxx.xxx.xxx.xx' (using …

php pdo wamp wampserver

5
推荐指数
1
解决办法
436
查看次数

VS 2017将找不到DirectX包含的文件

我已经安装了DirectX SDK,我想在Visual Studio 2017中的C++项目中使用.我配置了C++ include路径并添加了一个包含DirectX SDK包含文件($(DXSDK_DIR)Include\)的目录,这些文件正确地解析了C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include\所有文件所在的位置

但是当#include <d3dx9core.h>当我检查自己时,我尝试将其正确安装在Include目录中,它说它无法找到该文件.

我该如何解决?

c++ directx directx-9 visual-studio-2017

3
推荐指数
1
解决办法
5982
查看次数

constexpr 模板函数的无限递归

我用 constexpr 函数在 C++ 中实现了 FNV-1A 函数,但遇到了一个奇怪的问题。

这个版本没有问题:

template<size_t N>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], size_t position, uint32_t state) {
    return position >= N - 1 ? state : fnv1a_internal(data, position + 1, (state ^ data[position]) * 16777619UL);
}

template<size_t N>
static constexpr uint32_t fnv1a(const char (&data)[N]) {
    return fnv1a_internal(data, 0, 2166136261UL);
}
Run Code Online (Sandbox Code Playgroud)

但是当我将 position 设为 const 通用参数时,就像这样

template<size_t N, size_t Position>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], uint32_t state) {
    return Position >= N - 1 ? state …
Run Code Online (Sandbox Code Playgroud)

c++ generics templates constants constexpr

2
推荐指数
1
解决办法
104
查看次数