The original code is supposed to work. Section C++14 [expr.new]/7.4 even explicitly mentions this exact case, to say that it's an error if the string literal is too long for the array:
The expression in a noptr-new-declarator is erroneous if: [...]
- the new-initializer is a braced-init-list and the number of array elements for which initializers are provided (including the terminating
'\0' in a string literal) exceeds the number of elements
to initialize.
In the latest standard draft, the definition of list-initialization in [dcl.init.list]/3 says:
Otherwise, if T is a character array and the initializer list has a single element that is an appropriately-typed string literal, initialization is performed as described in that section.
(and the previous point before "Otherwise" was not triggered for this case).
Other comments mention some confusion about initialization rules. See DR 1490 - the C++11 text could be read as saying char s[4]{"abc"}; is ill-formed because it attempts to take the string literal as initializer for s[0]. However, the intent was that this code work -- any wording suggesting otherwise would be defective wording.
This was accepted as a defect, but the resolution process (DR 1467) did not complete until after the publication of C++14.
Defect resolutions are considered to retroactively replace the text they resolved; so code conforming to C++14 should use the rule as I quoted above, which is clear and unambiguous. Common sense would also use the same rule for C++11 conformance.
const char*m_data = new char[14]{'H','e','l','l','o',',',' ','W','o','r','l','d','!'};... not that I would recommend this ;-)