小编gaa*_*kam的帖子

我可以使用不完整类型列表的迭代器吗?

struct some_struct
{
    std::list<some_struct> nested;
};
Run Code Online (Sandbox Code Playgroud)

IIUC过去会调用UB,因为标准容器只需要用完整类型进行实例化.

但是,现在我们已经从这里取得了进展,根据http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4510.html我们可以实例化std::list,std::forward_list并且std::vector类型不完整,所以上面的代码已验证.

但是,但是,我可以进一步写下来:

struct some_struct
{
    std::list<some_struct>::iterator it;
};
Run Code Online (Sandbox Code Playgroud)

实例化容器并使用其成员类型是不一样的......例如,我被告知我可以实例化具有不完整类型的boost容器,但value_type除非模板参数是完整类型,否则我可能不会使用它们.所以我不确定上面的代码片段是否有效.

是吗?

c++ containers incomplete-type c++17

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

使用模板,如何区分两个并行的情况,例如浮点类型和整数类型?

cppreference.com(http://en.cppreference.com/w/cpp/types/enable_if#Notes)指出:

一个常见的错误是声明两个仅在默认模板参数上有所不同的函数模板.这是非法的,因为默认模板参数不是函数模板签名的一部分,并且声明具有相同签名的两个不同函数模板是非法的.

struct T {
    enum { int_t,float_t } m_type;
    template <typename Integer,
              typename = std::enable_if_t<std::is_integral<Integer>::value>
    >
    T(Integer) : m_type(int_t) {}

    template <typename Floating,
              typename = std::enable_if_t<std::is_floating_point<Floating>::value>
    >
    T(Floating) : m_type(float_t) {} // error: cannot overload
};
Run Code Online (Sandbox Code Playgroud)

那么真实......那么解决这个问题并实际实现上述错误代码无法实现的正确方法是什么?

c++ templates sfinae

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

当SignalR序列化字典并将其发送给客户端时,为什么将Dictionary键的首字母转换为小写?

这是从服务器发送到客户端的内容:

public class BattleHub : Hub
{
    public override async Task OnConnectedAsync()
    {
        await Clients.Client(Context.ConnectionId).SendAsync("ConfigurationInfo",
            new Dictionary<string, string> { { "WtF", "WtF" } });

        await base.OnConnectedAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是客户收到的:

{"wtF":"WtF"}
Run Code Online (Sandbox Code Playgroud)

如以下客户代码所示:

const battle_connection = new signalR.HubConnectionBuilder().withUrl("/battlehub").build()

battle_connection.on("ConfigurationInfo", (bigDict) => {
    window.alert(JSON.stringify(bigDict))
})
Run Code Online (Sandbox Code Playgroud)

注意到字典键的第一个字母的大小写有所变化吗?应该发送“ WtF”,但是发送“ wtF”。

为什么会这样?有什么办法可以防止呢?

奇怪的是,这仅发生在字典键上:如您所见,值保持不变。同样仅发送单个字符串,而不包装在字典中,不会导致首字母变为小写。一种List<string>也被正确发送。

所有键的所有字母的大小写在这里实际上都是有意义的,因此,如果将其中任何一个强制转换为小写,则会使应用程序出错!当然,尽管我们可以想到解决该问题的或多或少的丑陋方法,但是有什么方法可以在SignalR串行器中关闭此转换?

ASP .NET Core 2.1

dictionary case-sensitive lowercase asp.net-core-2.0 asp.net-core-signalr

5
推荐指数
2
解决办法
989
查看次数

指令集在汇编中做什么?

我的大学课程要求一些基本的组装知识……即使我没有任何知识。但是他们给了我们这个示例汇编代码:

080485fa <check_pin>:
 80485fa:       55                      push   ebp
 80485fb:       89 e5                   mov    ebp,esp
 80485fd:       81 7d 08 bf 07 00 00    cmp    DWORD PTR [ebp+0x8],0x7bf
 8048604:       0f 94 c0                sete   al
 8048607:       0f b6 c0                movzx  eax,al
 804860a:       5d                      pop    ebp
 804860b:       c3                      ret
Run Code Online (Sandbox Code Playgroud)

它应该或多或少地等同于以下C代码:

int check_pin(int pin) {
        return pin == 0x7bf;
}
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚这个汇编代码到底是做什么的,而我对此sete指令却傻眼了。这条指令做什么?

Wikibooks提供了一门有关x86汇编的课程,但是sete在致力于汇编指令的这一章中,我找不到任何内容。

x86 assembly

5
推荐指数
2
解决办法
2636
查看次数

为什么Haskell假定返回的monad类型与作为参数传递的类型相同?

为什么要编译此代码?

--sequence_mine :: Monad m => [m a] -> m [a]
sequence_mine [] = return []
sequence_mine (elt:l) = do
  e <- elt
  sl <- sequence l
  return (e:sl)
Run Code Online (Sandbox Code Playgroud)

注意我在这里特意注释掉了类型声明。但是即使没有类型声明,代码仍然可以编译并且可以按预期工作-这让我感到惊讶。

据我了解,在这方面应该产生歧义:

return (e:sl)
Run Code Online (Sandbox Code Playgroud)

原因是Haskell不应该知道我们要返回哪种类型的monad。为什么它必须与我们接受的类型相同?

要澄清更多。据我了解,如果我不明确地将类型声明与我注释过的类型声明类似,Haskell应该推断该函数具有如下类型:

sequence_mine :: (Monad m1, Monad m2) => [m1 a] -> m2 [a]
Run Code Online (Sandbox Code Playgroud)

除非我明确地统一起来m1m2通过将它们两者都调用m,否则Haskell没有理由相信它们都引用相同的类型!我想。

但是事实并非如此。我在这里想念什么?

monads haskell types function

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

为什么我不能将assert与std :: is_same一起使用?

有人可以向我解释为什么在地球上这个代码片段拒绝工作?

#include <cassert>
#include <type_traits>
using namespace std;

int main()
{
    assert(is_same<int, int>::value);
}
Run Code Online (Sandbox Code Playgroud)

编译失败,因为根据编译器:

prog.cpp:7:33: error: macro "assert" passed 2 arguments, but takes just 1
  assert(is_same<int, int>::value);
                             ^
prog.cpp: In function 'int main()':
prog.cpp:7:2: error: 'assert' was not declared in this scope
  assert(is_same<int, int>::value);
  ^
Run Code Online (Sandbox Code Playgroud)

什么?is_same<int, int>::value毫无疑问是一个论点.同样assert 在这个范围内声明的,编译器本身证实,在以前的错误!

http://ideone.com/LcMVkn

c++ assert

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

无法将"System.Byte"类型的对象强制转换为"System.UInt64"类型

是否byte转换为ulong

看起来似乎如此.这不会抛出:

byte wtf = HttpContext.Connection.RemoteIpAddress.GetAddressBytes()[0];
ulong ffs = (ulong)wtf;
Run Code Online (Sandbox Code Playgroud)

好的,让我们尝试将整个数组转换为:

ulong[] ip = HttpContext.Connection.RemoteIpAddress.GetAddressBytes().Cast<ulong>().ToArray();
Run Code Online (Sandbox Code Playgroud)

这引发了!?

System.InvalidCastException:'无法将'System.Byte'类型的对象强制转换为'System.UInt64'.'

嗯?解释器先生,当我要求你为变量执行此操作时,你怎么可能能够施展System.Byte,System.UInt64但当我要求你wtf立刻为整个阵列做这个时,你会抱怨?

说实话,这里发生了什么?我已经困了,想念一些简单的东西吗?有人可以向我解释这个吗?

c#

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

在封闭范围内重新声明变量是不确定的行为?

#include <iostream>
using namespace std;

int main() {
    int i = 0;
    if(true) {
        int i = 5;
        cout << i << '\n';
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

尝试在Ideone上运行上面的代码,看看它是否合法.结果让我感到困惑:

  • 我们有编译错误(1),(2)
  • 或者此代码5按预期打印(1)
  • 或者它什么都不打印(1),(2)

正如您从我的链接中看到的,每次在Ideone上编译时,相同的代码行为都完全不同!这闻起来像未定义的行为(UB).

OK C++因其不直观的行为而闻名但是! - 我承认它只是我的直觉,但我不希望C++在内部范围UB中重新声明一个变量!Id期望阴影或强制编译错误.

根据C++标准,我的代码真的是UB,还是只是Ideone和/或gcc的特性?如果它是UB,是UB,因为我重新申报i或出于其他原因我现在没有注意到?

c++ undefined-behavior

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

主返回IO Something而不是IO()的用途是什么?

我正在阅读http://learnyouahaskell.com/ ...令我惊讶的是:

因此,main始终具有类型签名main :: IO something,其中something是一些具体类型。

?因此main,不必一定是type IO(),而可以是IO(String)or IO(Int)吗?但是,这有什么用?

我玩了一些

m@m-X555LJ:~$ cat wtf.hs
main :: IO Int
main = fmap (read :: String -> Int) getLine
m@m-X555LJ:~$ runhaskell wtf.hs
1
m@m-X555LJ:~$ echo $?
0
m@m-X555LJ:~$
Run Code Online (Sandbox Code Playgroud)

嗯 因此,我的第一个假设被反驳。我认为这是Haskell程序将退出状态返回到Shell的一种方式,就像C程序从其启动int main()并使用return 0或报告退出状态一样return 1

但是1没有,上面的程序消耗了from输入的内容,然后什么也不做,特别是似乎没有将其返回1给shell。

再测试一次:

m@m-X555LJ:~$ cat wtf.hs
main = getContents
m@m-X555LJ:~$ runhaskell wtf.hs
m@m-X555LJ:~$ 
Run Code Online (Sandbox Code Playgroud)

哇。这次,我尝试返回IO String。由于我不知道的原因,这次Haskell 甚至 …

io haskell program-entry-point

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

为什么产品有界?

http://learnyouahaskell.com/functors-applicative-functors-and-monoids

Product 定义如下:

newtype Product a =  Product { getProduct :: a }  
    deriving (Eq, Ord, Read, Show, Bounded)
Run Code Online (Sandbox Code Playgroud)

为什么Product被迫成为Bounded

在同一本书中,以下几段内容:

它的实例Monoid有点像这样:

instance Num a => Monoid (Product a) where  
    mempty = Product 1  
    Product x `mappend` Product y = Product (x * y)
Run Code Online (Sandbox Code Playgroud)

嗯 唯一的约束是Num a!但是Num,尤其是Integer,这不是IntAFAIK的限制(不同于)。

然后让我们对其进行测试:

import Data.Monoid

numbers :: [Integer]
numbers = [1..100]

main = print (getProduct . mconcat . map Product …
Run Code Online (Sandbox Code Playgroud)

haskell bounded-types

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