小编Bat*_*eba的帖子

使用类名创建实例并调用构造函数

有没有办法在给定类名(动态)的情况下创建特定类的实例,并将参数传递给其构造函数.

就像是:

Object object = createInstance("mypackage.MyClass","MyAttributeValue");
Run Code Online (Sandbox Code Playgroud)

哪个"MyAttributeValue"是构造函数的参数MyClass.

java reflection instantiation

299
推荐指数
7
解决办法
42万
查看次数

为什么`abs()`的实现方式有所不同?

在过去的几周中,我的代码中出现了一个令人沮丧的错误。我的代码可以完全按照我的计算机上的预期运行,但是一旦将其移植到HPC服务器上,它就会产生奇怪的结果。

我将其归结为:在我的计算机(iMac)上,该函数abs()使用浮点数,但在服务器上将其abs()截断为整数。

例:

服务器

abs(-1.1341234) = 1
Run Code Online (Sandbox Code Playgroud)

我的Mac

abs(-1.1341234) = 1.1341234
Run Code Online (Sandbox Code Playgroud)

现在我知道我可以使用解决此fabs()问题,这不是问题。我看了gcc两台机器上的版本,这是输出:

服务器

g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/apps/software/GCCcore/5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --enable-languages=c,c++,fortran --enable-lto --enable-checking=release --disable-multilib --enable-shared=yes --enable-static=yes --enable-threads=posix --enable-gold=default --enable-plugins --enable-ld --with-plugin-ld=ld.gold --prefix=/apps/software/GCCcore/5.4.0 --with-local-prefix=/apps/software/GCCcore/5.4.0 --enable-bootstrap --with-isl=/dev/shm/GCCcore/5.4.0/dummy-/gcc-5.4.0/stage2_stuff
Thread model: posix
gcc version 5.4.0 (GCC) 
Run Code Online (Sandbox Code Playgroud)

我的Mac

g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,为什么abs()在gcc和clang之间会产生不同的结果?从字面上看,这个问题使我花了3个星期的时间,所以可以想像我刚才有点咸...

c++ gcc compilation clang

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

浮点除零的行为

考虑

#include <iostream>
int main()
{
    double a = 1.0 / 0;
    double b = -1.0 / 0;
    double c = 0.0 / 0;
    std::cout << a << b << c; // to stop compilers from optimising out the code.    
}
Run Code Online (Sandbox Code Playgroud)

我一直认为这a将是+ Inf,b将是-Inf,并且c将是NaN.但我也听到传言说严格来说浮点除零的行为是未定义的,因此上面的代码不能被认为是可移植的C++.(理论上,这会消除我的百万行加上代码堆栈的完整性.糟糕.)

谁是对的?

注意我对实现定义感到满意,但我在谈论吃猫,在这里恶魔打喷嚏的未定义行为.

c++ floating-point divide-by-zero undefined-behavior language-lawyer

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

数组向量的内存布局是什么?

任何人都可以解释一下记忆的布局

std::vector<std::array<int, 5>> vec(2)
Run Code Online (Sandbox Code Playgroud)

它是否提供具有2行5个元素的2D数组的连续内存块?

据我所知,矢量矢量

std::vector<std::vector<int>> vec(2, std::vector<int>(5))
Run Code Online (Sandbox Code Playgroud)

提供存储器中不同位置两个 长度为 5个元素连续数组的存储器布局.

对于数组的向量是否相同?

c++ stdvector language-lawyer c++11 stdarray

46
推荐指数
4
解决办法
3262
查看次数

模板默认参数丢失其引用类型

考虑

#include <iostream>
#include <type_traits>

template <class T, class ARG_T = T&>
T foo(ARG_T v){
    return std::is_reference<decltype(v)>::value;
}

int main() {
    int a = 1;
    std::cout << foo<int>(a) << '\n';
    std::cout << foo<int, int&>(a) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我希望两种情况下的输出均为1。但在第一种情况下为0:与默认值class ARG_T = T而不是一致class ARG_T = T&

我想念什么?

c++ templates function-templates template-argument-deduction argument-deduction

43
推荐指数
2
解决办法
966
查看次数

当对自动变量的析构函数调用修改函数返回值时,在 MSVC14.1 和 gcc8.3 之间观察到的差异

考虑以下(用 C++14 编译)

#include <iostream>
#include <vector>

// Foo adds an element to a std::vector passed by reference
// on construction in the destructor
struct Foo {
    Foo(std::vector<double>& v) : m_v(v){
    }
    ~Foo(){
        m_v.push_back(1.0);
    }
    std::vector<double>& m_v;
};

std::vector<double> bar(){
    std::vector<double> ret;
    Foo foo(ret);
    return ret;
}

int main(){
    std::cout << bar().size() << "\n";
}
Run Code Online (Sandbox Code Playgroud)

在 gcc8.3 中,输出是1,这意味着foos 析构函数对返回的向量有影响。

在 MSVC14.1 中,输出是0. 您可以通过更换线路强制输出是一样的gcc8.3Foo foo(ret);{Foo foo(ret);}(即通过强制的范围)。

我不认为这是悬空引用未定义行为(因为ret在之前声明 …

c++ c++14

36
推荐指数
2
解决办法
1293
查看次数

"有趣"和"有趣"之间的类型差异?

表达式fun&fun类型是否相同?

请考虑以下代码:

template <typename Check, typename T>
void check(T)
{
    static_assert(is_same<Check, T>::value);
}

void fun()
{}

check<void(*)()>(fun);
check<void(*)()>(&fun);

cout << typeid(fun).name() << endl;
cout << typeid(&fun).name() << endl;
Run Code Online (Sandbox Code Playgroud)

两个断言都成功,这表明两个表达式都具有相同的类型.然而,typeids返回不同的结果:

FvvE
PFvvE
Run Code Online (Sandbox Code Playgroud)

这是为什么?

c++ types function-pointers language-lawyer

30
推荐指数
3
解决办法
3267
查看次数

std :: any_of是否需要遵循短路逻辑?

鉴于以下代码,

std::vector<int> numbers = {1, 2, 3, 4, 5};
std::any_of(std::begin(numbers), std::end(numbers), 
            [](int number) { return number > 3; } );
Run Code Online (Sandbox Code Playgroud)

std :: any_of需要(按标准),一旦达到4就返回?

c++ stl language-lawyer c++11

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

对大枚举值的表示有什么保证吗?

假设我(在32位机器上)

enum foo {
    val1 = 0x7FFFFFFF, // originally '2^31 - 1'
    val2,
    val3 = 0xFFFFFFFF, // originally '2^32 - 1'
    val4,
    val5
};
Run Code Online (Sandbox Code Playgroud)

val2,val4和val5的值是多少?我知道我可以测试它,但结果是标准化的吗?

c c++ enums

28
推荐指数
3
解决办法
1707
查看次数

复制构造函数中的C ++名称空间冲突

我有以下代码:

namespace A {
    struct Foo {
        int a;
    };
}

struct Foo {
    int b;
};

struct Bar : public A::Foo {
    Bar(Foo foo) {
        c = foo.b;
    }
    int c;
};
Run Code Online (Sandbox Code Playgroud)

C ++编译器抱怨“ c = foo.b”,因为A :: Foo没有名为b的成员。如果我用:: Foo更改Bar参数的类型,它将起作用。

我的问题是此行为背后的原因是什么(我想这与继承使Bar进入A名称空间这一事实有关,但是我找不到任何文档来支持该理论。

c++ inheritance namespaces language-lawyer

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