小编kei*_*ith的帖子

具有隐式转换运算符的类上的static_cast <>行为,该运算符返回const引用

我有以下类(剥离以仅包含相关部分):

#include <string>

class Text
{
private:
    std::string _text;

public:
    Text(std::string&& text) :
        _text(std::move(text))
    {
    }

    operator const std::string&() const
    {
        return _text;
    }
};
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果我想获得一个const std::string&,我可以这样做而不会受到任何惩罚:

 Text text("fred");

 auto& s = static_cast<std::string>(text);
Run Code Online (Sandbox Code Playgroud)

或者这将构建一个std::string我最终获得引用的中间体?这种情况是否有标准方法?我是C++的新手.

c++ c++11

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

更改完全不相关的代码时,Visual Studio C++编译器会生成3倍慢的代码

我有一个嵌套的for循环,它生成以下程序集:

# branch target labels manually added for readability
002E20F8  mov         ebx,esi  
002E20FA  mov         dword ptr [ebp-10h],3B9ACA00h  
002E2101  sub         ebx,edi  
002E2103  add         ebx,7  
002E2106  shr         ebx,3  
002E2109  nop         dword ptr [eax]  
  outer_loop:
002E2110  xor         eax,eax  
002E2112  xor         ecx,ecx  
002E2114  cmp         edi,esi  
002E2116  mov         edx,ebx  
002E2118  cmova       edx,eax  
002E211B  mov         eax,edi  
002E211D  test        edx,edx 
002E211F  je          main+107h (02E2137h)  ;end_innerloop

  inner_loop:           
002E2121  movsd       xmm0,mmword ptr [eax] 
002E2125  inc         ecx                     ; inc/addsd swapped
002E2126  addsd       xmm0,mmword ptr [k]   
002E212B  add         eax,8  
002E212E  movsd …
Run Code Online (Sandbox Code Playgroud)

c++ performance x86 assembly visual-c++

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

将std :: unique_ptr传递给构造函数以获取所有权

我想传递std::unique_ptr给一个类的构造函数,该类将获取所拥有的数据的所有权std::unique_ptr.

在编译器处理它们如何使其中一个更受欢迎的方法foo和方法之间是否存在任何差异bar

foo 类:

template <class T>
class foo
{
    std::unique_ptr<T> data_;

public:
    foo(std::unique_ptr<T>&& data) :
        data_{ std::forward<std::unique_ptr<T>>(data) }
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

bar 类:

template <class T>
class bar
{
    std::unique_ptr<T> data_;

public:
    bar(std::unique_ptr<T> data) :
        data_{ std::move(data) }
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

clang、std::function 和 -fno-rtti

我正在通过 clang-cl 在 Windows 上使用 Clang 5,并且-fno-rtti在使用std::function.

这是我无法编译的示例:

#include <functional>

void foo(std::function<void()> ra2)
{
}

int main()
{
    auto bar = []()
    {
    };

    foo(bar);

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

命令行:

clang-cl test.cpp -Xclang -fno-rtti
Run Code Online (Sandbox Code Playgroud)

错误是:

C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Tools\MSVC\14.13.26128\include\functional(435,11):  error:
      cannot use typeid with -fno-rtti
                return (typeid(_Callable));
                        ^
Run Code Online (Sandbox Code Playgroud)

这让我感到惊讶,有没有办法std::function在没有 RTTI 的情况下在 Clang 中使用lambdas?该文件说,只有targettarget_typestd::function应该需要RTTI。我可以推出自己的 版本std::function,但不得不这样做似乎很可惜。

如果我将 MSVC 与编译器标志一起使用,它工作正常/GR-

c++ clang c++11 clang-cl

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

Haxe - 将haxe代码编译为.NET DLL而不是EXE

是否可以使用haxe编译器将haxe代码直接编译为.NET DLL而不是EXE?

c# haxe

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

停止r值调用移动赋值C++ 11

考虑一个我不想修改的简单C++类:

class foo {};
Run Code Online (Sandbox Code Playgroud)

然后,如果我执行以下操作,我将调用移动赋值运算符:

foo f{};

f = foo{};
Run Code Online (Sandbox Code Playgroud)

有没有办法在不修改foo或使用这样的中间件的情况下调用复制赋值g:

foo f{};
foo g{};
f = g;
Run Code Online (Sandbox Code Playgroud)

差不多好像有std::dont_move!

c++ c++11

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

std::stringstream 相当于 u32string?

是否有等价物std::stringstream可以让我构建一个std::u32string?如果不是,我怎么std::u32string能从大量由char32_t数据组成的可变长度文本片段中构建一个?

c++ c++11

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

Clang 10 无法在 macOS 10.12 上将 C++ 应用程序与 CMake 链接

我有一个运行 macOS 10.12 的 Jenkins 构建服务器。

我正在使用最新的 Clang 10(不是 AppleClang)和 CMake 3.17 编译 C++ 应用程序。

我得到的错误是:

The C++ compiler

"/Users/XXX/llvm/bin/clang++"

is not able to compile a simple test program.

It fails with the following output:

ld: unknown option: -platform_version
clang-10: error: linker failed with exit code 1
Run Code Online (Sandbox Code Playgroud)

这适用于同一服务器上的 Clang 9,而 Clang 10 在 macOS 10.15 上运行良好,所有其他构建工具和源文件都相同(Jenkins 每次都运行一个干净的构建)。它似乎是 Clang 10 和 macOS 10.12 的组合。Clang 9 和 Clang 10 之间有什么变化会导致这种情况吗?

我像这样调用 CMake:

cmake -DCMAKE_OSX_SYSROOT="${macos_sdk}" \
      -DCMAKE_C_COMPILER="${llvm_bin}/clang" \
      -DCMAKE_CXX_COMPILER="${llvm_bin}/clang++" \
      -DCMAKE_OSX_ARCHITECTURES=${architectures} \
      -DCMAKE_BUILD_TYPE=${make_build_type} …
Run Code Online (Sandbox Code Playgroud)

c++ macos cmake clang llvm-clang

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

实现自定义迭代器以使用std :: sort

我的目标是学习如何从头开始编写自定义迭代器.我写了以下迭代器:

#include <iterator>

template<class D>
class SpanIterator final : public std::iterator<std::random_access_iterator_tag, D>
{
private:
    D* _data;

public:
    explicit SpanIterator(D* data) :
        _data{ data }
    {
    }

    SpanIterator(const SpanIterator& itertator) = default;

    SpanIterator& operator=(const SpanIterator& iterator) = default;

    SpanIterator& operator=(D* data)
    {
        _data = data;

        return *this;
    }

    operator bool() const
    {
        return _data != nullptr;
    }

    bool operator==(const SpanIterator& itertator) const
    {
        return _data == itertator._data;
    }

    bool operator!=(const SpanIterator& itertator) const
    {
        return _data != itertator._data;
    }

    SpanIterator& operator+=(const …
Run Code Online (Sandbox Code Playgroud)

c++11

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

可以在C++中禁止隐式转换吗?

我们都知道C++是一种弱类型语言.它并不总是方便直观.例如,从double到int的隐式转换会导致精确丢失.关于变通方法的任何想法?

c++ types casting visual-c++

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

替换已弃用的 NXOpenEventStatus?

我需要获取 OSX 10.13 上鼠标的跟踪速度。我在互联网上找到了这段代码,但 NXOpenEventStatus 已被弃用(IOHIDGetAccelerationWithKey 也是如此),是否有其他方法?

#include <stdio.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/hidsystem/IOHIDLib.h>
#include <IOKit/hidsystem/IOHIDParameter.h>
#include <IOKit/hidsystem/event_status_driver.h>

int main()
{
    kern_return_t kr;
    double trackpadAcceleration, mouseAcceleration;
    NXEventHandle h = 0;

    h = NXOpenEventStatus();

    if (h == nil)
        return -1;


   kr = IOHIDGetAccelerationWithKey( h, CFSTR(kIOHIDMouseAccelerationType), &mouseAcceleration);


   return 0;
}
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c

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

标签 统计

c++ ×8

c++11 ×6

clang ×2

macos ×2

visual-c++ ×2

assembly ×1

c# ×1

casting ×1

clang-cl ×1

cmake ×1

cocoa ×1

haxe ×1

llvm-clang ×1

objective-c ×1

performance ×1

types ×1

x86 ×1